Chuyển tới nội dung chính

std::string

#include <string>

typedef basic_string<char> string;

std::string là một lớp (class) trong thư viện chuẩn C++ (STL) cung cấp các chức năng để làm việc với chuỗi ký tự (sequences of characters) một cách thuận tiện, an toàn và hiệu quả. std::string là trường hợp đặc biệt (specialization) của lớp mẫu std::basic_string với kiểu ký tự là char.

Đặc điểm

  1. Quản lý bộ nhớ tự động: std::string tự động quản lý bộ nhớ cấp phát cho chuỗi, bao gồm cấp phát, giải phóng và thay đổi kích thước khi cần thiết. Bạn không cần phải lo lắng về việc cấp phát và giải phóng bộ nhớ thủ công như khi làm việc với mảng ký tự C-style.
  2. Hiệu quả: std::string được thiết kế để hoạt động hiệu quả với các thao tác chuỗi phổ biến.
  3. Tính năng phong phú: std::string cung cấp một loạt các phương thức thành viên để thao tác với chuỗi, bao gồm:
    • Truy cập ký tự.
    • Nối chuỗi.
    • Tìm kiếm.
    • Thay thế.
    • So sánh.
    • Trích xuất chuỗi con.
    • Chuyển đổi sang các kiểu dữ liệu khác.
    • Và nhiều hơn nữa...
  4. An toàn: std::string cung cấp các cơ chế kiểm tra lỗi, ví dụ như kiểm tra truy cập ngoài phạm vi, giúp tránh được các lỗi thường gặp khi làm việc với chuỗi ký tự C-style.
Lưu ý
  • Trong phần lớn các trường hợp, bạn sẽ sử dụng các kiểu chuỗi định nghĩa sẵn (std::string, std::wstring, ...) thay vì sử dụng trực tiếp std::basic_string.
  • Khi sử dụng các kiểu chuỗi khác ngoài std::string, bạn cần chú ý đến tiền tố của chuỗi ký tự (L, u, U) và sử dụng các hàm/luồng (stream) phù hợp (ví dụ: std::wcout thay vì std::cout cho std::wstring).
  • Phần lớn các hàm trong thư viện <algorithm> có thể làm việc với iterator của các kiểu chuỗi này.

Ví dụ:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
std::string str = "Hello, world!";

// In ra từng ký tự
for (char c : str) {
std::cout << c;
}
std::cout << std::endl;

// Chuyển đổi thành chữ hoa
std::transform(str.begin(), str.end(), str.begin(), ::toupper);
std::cout << str << std::endl;

// Tìm vị trí của dấu phẩy
size_t commaPos = str.find(",");
if (commaPos != std::string::npos) {
std::cout << "Comma found at position: " << commaPos << std::endl;
}

// Thay thế dấu phẩy bằng dấu chấm than
str.replace(commaPos, 1, "!");
std::cout << str << std::endl;

// Thêm chuỗi
str.append(" Have a nice day!");
std::cout << str << std::endl;

// Kiểm tra độ dài
std::cout << "Length: " << str.length() << std::endl;

return 0;
}

Các cách phổ biến khai báo và khởi tạo một chuỗi

  1. Khai báo chuỗi rỗng:

    • Tạo ra một chuỗi rỗng, không có ký tự nào.
    • std::string là trường hợp đặc biệt (typedef) của basic_string với kiểu ký tự là char.
    std::string str;
  2. Khai báo và khởi tạo bằng chuỗi ký tự C-style (const char*):

    • Tạo một chuỗi mới và sao chép nội dung của chuỗi ký tự C-style vào.
    • Chuỗi ký tự C-style phải kết thúc bằng ký tự null ('\0').
    std::string str1("Hello, world!");
    std::string str2 = "Hello, world!";
  3. Khai báo và khởi tạo bằng một phần của chuỗi ký tự C-style:

    • Tạo một chuỗi mới và sao chép n ký tự đầu tiên từ chuỗi ký tự C-style (trong ví dụ này là 5 ký tự).
    const char* cstr = "Hello, world!";
    std::string str3(cstr, 5); // str3 = "Hello"
  4. Khai báo và khởi tạo bằng một ký tự lặp lại nhiều lần:

    • Tạo một chuỗi mới chứa n lần lặp lại của một ký tự cho trước (trong ví dụ này là 10 ký tự '*').
    std::string str4(10, '*'); // str4 = "**********"
  5. Khai báo và khởi tạo bằng một basic_string khác:

    • Tạo một bản sao của chuỗi đã tồn tại.
    std::string str5 = "Copy me!";
    std::string str6(str5); // str6 = "Copy me!"
    std::string str7 = str5; // str7 = "Copy me!"
  6. Khai báo và khởi tạo bằng cách sử dụng iterator:

    • Tạo một chuỗi mới từ một phạm vi con (subrange) của một chuỗi khác, được xác định bởi các iterator begin và end.
    std::string str8 = "abcdefg";
    std::string str9(str8.begin() + 1, str8.end() - 1); // str9 = "bcdef"
  7. Khai báo và khởi tạo bằng cách sử dụng initializer list (từ C++11):

    • Tạo một chuỗi mới từ một danh sách các ký tự được khởi tạo.
    std::string str10{'a', 'b', 'c', 'd', 'e'}; // str10 = "abcde"
  8. Sử dụng assign():

    • Phương thức assign() cho phép bạn gán nội dung mới cho một chuỗi đã tồn tại.
    std::string str11;
    str11.assign("Another way"); // str11 = "Another way"
    std::string str12;
    str12.assign(str11, 0, 7); // str12 = "Another"
  9. Sử dụng operator=:

    • Toán tử = cho phép gán nội dung mới cho một chuỗi đã tồn tại.
    std::string str13;
    str13 = "Using operator="; // str13 = "Using operator="
  10. Sử dụng std::move (từ C++11):

    • Di chuyển nội dung từ một chuỗi khác sang chuỗi mới, giúp tránh việc sao chép tốn kém. Sau khi di chuyển, chuỗi nguồn (str14 trong ví dụ) sẽ ở trạng thái hợp lệ nhưng không xác định.
    std::string str14 = "Move this";
    std::string str15 = std::move(str14); // str15 = "Move this", str14 có thể rỗng hoặc chứa giá trị không xác định.

Các hàm thành viên

=Gán một giá trị mới cho một đối tượng std::string, thay thế nội dung hiện tại của nó

Trình lặp (Iterators)

beginTrả về một iterator trỏ đến ký tự đầu tiên của chuỗi std::string
endTrả về một iterator trỏ đến vị trí ngay sau ký tự cuối cùng của chuỗi std::string
rbeginTrả về một reverse iterator trỏ đến ký tự cuối cùng của chuỗi
rendTrả về một reverse iterator trỏ đến vị trí "giả định" nằm trước phần tử đầu tiên của chuỗi
cbeginTrả về một const iterator trỏ đến ký tự đầu tiên của chuỗi
cendTrả về một const iterator trỏ đến vị trí ngay sau ký tự cuối cùng của chuỗi
crbeginTrả về một const reverse iterator trỏ đến ký tự cuối cùng của chuỗi
crendTrả về một const reverse iterator trỏ đến vị trí "giả định" nằm trước phần tử đầu tiên của chuỗi

Dung lượng (Capacity)

sizeTrả về số lượng ký tự hiện có trong chuỗi
lengthTrả về số lượng ký tự hiện có trong chuỗi
max_sizeTrả về số lượng ký tự tối đa mà một đối tượng std::string có thể chứa
resizeTrả về số lượng ký tự tối đa mà một đối tượng std::string có thể chứa
capacityTrả về dung lượng bộ nhớ hiện tại được cấp phát cho chuỗi
reserveYêu cầu thay đổi dung lượng (capacity) của chuỗi, sao cho nó có thể chứa ít nhất một số lượng ký tự được chỉ định mà không cần phải cấp phát lại.
clearXóa tất cả các ký tự khỏi chuỗi, làm cho chuỗi trở thành rỗng
emptyKiểm tra xem chuỗi có rỗng hay không
shrink_to_fitYêu cầu giảm dung lượng của chuỗi cho khớp với kích thước hiện tại của nó

Truy cập phần tử

[]Truy cập đến ký tự tại một vị trí cụ thể trong chuỗi
atTruy cập đến ký tự tại một vị trí cụ thể trong chuỗi, có kiểm tra phạm vi
backTrả về tham chiếu đến ký tự cuối cùng của chuỗi
frontTrả về tham chiếu đến ký tự đầu tiên của chuỗi

Thay đổi nội dung (Modifiers)

operator+=Nối thêm nội dung vào cuối chuỗi hiện tại
appendNối thêm nội dung vào cuối chuỗi hiện tại
push_backThêm một ký tự duy nhất vào cuối chuỗi
assignGán nội dung mới cho chuỗi, thay thế nội dung hiện tại của nó
insertChèn thêm nội dung (ký tự, chuỗi, hoặc phạm vi) vào bên trong chuỗi tại một vị trí xác định
eraseXóa bỏ một phần hoặc toàn bộ nội dung của chuỗi
replaceThay thế một phần của chuỗi bằng một nội dung mới
swapHoán đổi nội dung của hai chuỗi std::string một cách hiệu quả
pop_backXóa ký tự cuối cùng khỏi chuỗi

Hoạt động chuỗi

c_strTrả về một con trỏ đến một mảng ký tự chứa nội dung của chuỗi, được biểu diễn dưới dạng chuỗi ký tự kiểu C
dataTrả về một con trỏ đến mảng ký tự bên trong mà std::string sử dụng để lưu trữ nội dung của chuỗi
get_allocatorTrả về một bản sao của bộ cấp phát được sử dụng bởi đối tượng std::string để quản lý bộ nhớ
copySao chép một chuỗi con của chuỗi hiện tại vào một mảng ký tự do người dùng cung cấp
findTìm kiếm sự xuất hiện đầu tiên của một chuỗi con, một ký tự, hoặc một chuỗi ký tự C-style bên trong một chuỗi std::string
rfindTìm kiếm sự xuất hiện cuối cùng của một chuỗi con, một ký tự, hoặc một chuỗi ký tự C-style bên trong một chuỗi std::string
find_first_ofTìm kiếm sự xuất hiện đầu tiên trong chuỗi hiện tại của bất kỳ ký tự nào thuộc về một tập hợp các ký tự được chỉ định
find_last_ofTìm kiếm sự xuất hiện cuối cùng trong chuỗi hiện tại của bất kỳ ký tự nào thuộc về một tập hợp các ký tự được chỉ định
find_first_not_ofTìm kiếm sự xuất hiện đầu tiên trong chuỗi hiện tại của bất kỳ ký tự nào không thuộc về một tập hợp các ký tự được chỉ định
find_last_not_ofTìm kiếm sự xuất hiện cuối cùng trong chuỗi hiện tại của bất kỳ ký tự nào không thuộc về một tập hợp các ký tự được chỉ định
substrTrích xuất một chuỗi con từ một chuỗi std::string hiện có
compareSo sánh chuỗi hiện tại với một chuỗi khác

Không phải hàm thành viên

operator+Nối hai chuỗi lại với nhau, tạo ra một chuỗi mới
Toán tử quan hệSo sánh hai chuỗi std::string với nhau
Toán tử >>Đọc dữ liệu từ một luồng đầu vào và lưu trữ nó vào một đối tượng std::string
Toán tử <<Ghi hoặc đưa nội dung của một chuỗi std::string vào một luồng đầu ra
getlineĐọc một dòng dữ liệu từ luồng đầu vào và lưu trữ nó vào một đối tượng std::string

Hằng số thành viên

nposGiá trị hằng số tĩnh đặc biệt, biểu thị "không tìm thấy vị trí" hoặc "đến cuối chuỗi"