Dường như mỗi lần bạn thêm một phần tử mới vào std::vector
, nếu không có phần tử trống, số phần tử được phân bổ sẽ tăng gấp đôi (ít nhất là trong GCC 4.9). Tôi nghĩ rằng điều này được thực hiện để đạt được độ phức tạp liên tục được phân bổ theo thời gian.std :: phân bổ vector và bộ nhớ
Ví dụ, sau khi chạy đoạn mã này:
v.push_back (1);
v.push_back (2);
v.push_back (3);
v.push_back (4);
v.push_back (5);
v.shrink_to_fit(); // capacity is 5 now
v.push_back (6);
std::cout << v.capacity() << std::endl;
Kết quả là 10.
Trong các hệ thống bộ nhớ hạn chế, có cách nào để ngăn chặn hành vi này ngay cả khi nó là phải trả giá bằng một buổi biểu diễn hình phạt?
Hơn nữa, có thể chỉ ra rằng nó chỉ cấp phát một số lượng cố định các phần tử thay vì tăng gấp đôi không?
Tôi biết tôi có thể gọi std::vector::reserve()
trước khi thêm yếu tố mới, nhưng có vẻ như một sự lộn xộn trong trường hợp của tôi ... gọi std::vector::shrink_to_fit()
là một cách tiếp cận khác, nhưng cũng bất tiện.
Bạn có thực sự kiểm tra dung lượng sau khi gọi đến 'shrink_to_fit' không? – juanchopanza
Để tránh (giảm) sự lộn xộn, bạn có thể viết hàm tự do của riêng bạn cần một vectơ và một phần tử để thêm vào và sau đó thực hiện 'v.reserve (v.size() + 1)' theo sau là 'push_back'. – dlf
tại sao không sử dụng mảng trong trường hợp đó (nếu bạn cần kích thước cố định) – 4pie0