2014-09-08 26 views
7

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.

+0

Bạn có thực sự kiểm tra dung lượng sau khi gọi đến 'shrink_to_fit' không? – juanchopanza

+5

Để 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

+3

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

Trả lời

5

Không có cách nào.

Tùy chọn duy nhất của bạn là viết cấu trúc dữ liệu vectơ của riêng bạn và cách bạn có thể làm bất cứ điều gì bạn muốn với nó (hoặc bạn chỉ cần sao chép thư viện internet/C++ và thay đổi những gì bạn cần và bao gồm vector mới đó trong chương trình của bạn).

Thực ra bạn cũng có thể sử dụng một mảng và lệnh realloc.

+0

Làm thế nào để bạn sử dụng một mảng cùng với realloc? –

Các vấn đề liên quan