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
- 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.
- 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.
- 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...
- 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
-
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;
-
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!"; -
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" -
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 = "**********"
-
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!" -
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" -
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"
-
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" - Phương thức
-
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=" - Toán tử
-
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)
begin | Trả về một iterator trỏ đến ký tự đầu tiên của chuỗi std::string |
end | Trả về một iterator trỏ đến vị trí ngay sau ký tự cuối cùng của chuỗi std::string |
rbegin | Trả về một reverse iterator trỏ đến ký tự cuối cùng của chuỗi |
rend | Trả 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 |
cbegin | Trả về một const iterator trỏ đến ký tự đầu tiên của chuỗi |
cend | Trả về một const iterator trỏ đến vị trí ngay sau ký tự cuối cùng của chuỗi |
crbegin | Trả về một const reverse iterator trỏ đến ký tự cuối cùng của chuỗi |
crend | Trả 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)
size | Trả về số lượng ký tự hiện có trong chuỗi |
length | Trả về số lượng ký tự hiện có trong chuỗi |
max_size | Trả về số lượng ký tự tối đa mà một đối tượng std::string có thể chứa |
resize | Trả về số lượng ký tự tối đa mà một đối tượng std::string có thể chứa |
capacity | Trả về dung lượng bộ nhớ hiện tại được cấp phát cho chuỗi |
reserve | Yê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. |
clear | Xóa tất cả các ký tự khỏi chuỗi, làm cho chuỗi trở thành rỗng |
empty | Kiểm tra xem chuỗi có rỗng hay không |
shrink_to_fit | Yê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 |
at | Truy cập đến ký tự tại một vị trí cụ thể trong chuỗi, có kiểm tra phạm vi |
back | Trả về tham chiếu đến ký tự cuối cùng của chuỗi |
front | Trả 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 |
append | Nối thêm nội dung vào cuối chuỗi hiện tại |
push_back | Thêm một ký tự duy nhất vào cuối chuỗi |
assign | Gán nội dung mới cho chuỗi, thay thế nội dung hiện tại của nó |
insert | Chè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 |
erase | Xóa bỏ một phần hoặc toàn bộ nội dung của chuỗi |
replace | Thay thế một phần của chuỗi bằng một nội dung mới |
swap | Hoán đổi nội dung của hai chuỗi std::string một cách hiệu quả |
pop_back | Xóa ký tự cuối cùng khỏi chuỗi |
Hoạt động chuỗi
c_str | Trả 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 |
data | Trả 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_allocator | Trả 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ớ |
copy | Sao 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 |
find | Tì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 |
rfind | Tì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_of | Tì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_of | Tì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_of | Tì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_of | Tì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 |
substr | Trích xuất một chuỗi con từ một chuỗi std::string hiện có |
compare | So 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
npos | Giá 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" |