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

std::string::capacity

#include <string>

size_type capacity() const noexcept;

Trả về dung lượng bộ nhớ hiện tại được cấp phát cho chuỗi. Nói cách khác, nó cho biết số lượng ký tự tối đa mà chuỗi có thể chứa mà không cần phải cấp phát lại bộ nhớ.

Tham số

Không có tham số

Giá trị trả về

size_type

  • Một kiểu số nguyên không dấu (thường là std::size_t) đại diện cho dung lượng hiện tại của chuỗi (số lượng ký tự mà chuỗi có thể chứa mà không cần cấp phát lại).

Đặc điểm

  1. capacity() luôn lớn hơn hoặc bằng size().
  2. Giá trị cụ thể của capacity() sau khi khởi tạo hoặc sau các thao tác thay đổi kích thước chuỗi là không xác định (implementation-defined) và có thể khác nhau giữa các trình biên dịch và thư viện chuẩn.
  3. Khi size() vượt quá capacity(), std::string sẽ tự động cấp phát lại bộ nhớ (thường là tăng gấp đôi capacity()), dẫn đến việc sao chép các ký tự sang vùng nhớ mới. Quá trình này có thể tốn kém về mặt hiệu năng.
  4. Bạn có thể sử dụng reserve() để yêu cầu std::string cấp phát trước một lượng bộ nhớ nhất định, giúp tránh việc cấp phát lại nhiều lần khi thêm ký tự vào chuỗi.
  5. shrink_to_fit() (từ C++11) có thể được sử dụng để yêu cầu std::string giảm capacity() cho khớp với size(), nhưng yêu cầu này không được đảm bảo thực hiện.
  6. capacity() không thay đổi nội dung hoặc kích thước (size) của chuỗi. Nó chỉ trả về thông tin về dung lượng hiện tại.
  7. Hàm capacity() được chỉ định là noexcept (từ C++11), nghĩa là nó được đảm bảo không ném ra ngoại lệ.
  8. capacity() thường được sử dụng để:
    • Kiểm tra xem chuỗi có cần phải cấp phát lại bộ nhớ khi thêm ký tự hay không.
    • Tối ưu hóa hiệu năng bằng cách ước lượng dung lượng cần thiết trước khi thực hiện các thao tác có thể làm thay đổi kích thước chuỗi.
    • Tìm hiểu cách thức std::string quản lý bộ nhớ.

Ví dụ

#include <iostream>
#include <string>

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

std::cout << "Size: " << str.size() << std::endl;
std::cout << "Capacity: " << str.capacity() << std::endl;

str.reserve(100); // Yêu cầu capacity ít nhất là 100
std::cout << "Size after reserve(100): " << str.size() << std::endl;
std::cout << "Capacity after reserve(100): " << str.capacity() << std::endl;

str.append(" World!");
std::cout << "Size after append: " << str.size() << std::endl;
std::cout << "Capacity after append: " << str.capacity() << std::endl;

return 0;
}

Các hàm liên quan

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.
lengthTrả về số lượng ký tự hiện có trong chuỗi
sizeTrả 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