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

std::basic_string

#include <string>

template < class charT,                        // Kiểu ký tự (ví dụ: char, wchar_t)
class traits = char_traits<charT>, // Đặc tính của kiểu ký tự
class Allocator = allocator<charT> // Bộ cấp phát bộ nhớ
>
class basic_string;

basic_string là một lớp mẫu (class template) 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). Nó cung cấp một cách an toàn và hiệu quả để quản lý, thao tác và lưu trữ chuỗi.

Tham số

charT

  • Kiểu ký tự của chuỗi.

traits

  • Lớp đặc tính (traits class) định nghĩa các thao tác cơ bản trên kiểu ký tự charT. Thường sử dụng std::char_traits mặc định.

Allocator

  • Lớp cấp phát bộ nhớ (allocator class) được sử dụng để quản lý bộ nhớ cho chuỗi. Thường sử dụng std::allocator mặc định.

Đặc điểm

  1. Tổng quát hóa: basic_string là một phiên bản tổng quát cho phép bạn làm việc với các loại ký tự khác nhau (ví dụ: char, wchar_t, char16_t, char32_t).
  2. Các kiểu chuỗi cụ thể: Thư viện chuẩn C++ định nghĩa sẵn các kiểu chuỗi cụ thể dựa trên basic_string, bao gồm:
    • std::string (chuỗi ký tự char) - phổ biến nhất
    • std::wstring (chuỗi ký tự rộng wchar_t)
    • std::u16string (chuỗi ký tự char16_t - từ C++11)
    • std::u32string (chuỗi ký tự char32_t - từ C++11)
  3. Quản lý bộ nhớ tự động: basic_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.
  4. Hiệu quả: basic_string được thiết kế để hoạt động hiệu quả với các thao tác chuỗi phổ biến.
  5. Tính năng phong phú: basic_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...
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 kiểu chuỗi cụ thể

Thư viện chuẩn C++ định nghĩa sẵn các kiểu chuỗi cụ thể (thông qua typedef) dựa trên std::basic_string, bao gồm:

Kiểu chuỗiKiểu ký tự (charT)Kiểu ký tự (charT)
std::stringcharChuỗi ký tự 8-bit (thường dùng cho ASCII, UTF-8)
std::wstringwchar_tChuỗi ký tự rộng (wide character), kích thước tùy thuộc vào implementation (thường 16-bit hoặc 32-bit)
std::u16stringchar16_tChuỗi ký tự UTF-16 (từ C++11)
std::u32stringchar32_tChuỗi ký tự UTF-32 (từ C++11)