2012-04-03 37 views
5

Khi tôi gọi std::vector::reserve khi nhận diện là loại std::vector<Foo*>reserve(...) không làm gì:C++: std :: vector :: dự trữ chưa đặt trước khi có chứa con trỏ

std::vector<int*> bar; 
bar.reserve(20); 

//I expect bar.size to return 20... 
std::size_t sz = bar.size(); 
for(std::size_t i = 0; i < sz; ++i) { 
    //Do Stuff to all items! 
} 

Các nói trên for vòng lặp chạy chính xác bằng không lần và quầy bar. size() trả về số không. Tôi không nhớ nếu điều này cũng đúng cho tất cả các container STL khác, nhưng nếu có, bao gồm hành vi cho std :: vector: TẠI SAO?

+1

Ngoài những thứ bên dưới, tôi nghĩ bạn cũng muốn sử dụng 'std :: vector :: size_type' thay vì chỉ' std :: size_t'. Tôi không chắc nó quan trọng đến mức nào, nhưng tôi đã thấy điều này được nhắc đến như là một loại "thực hành tốt nhất" cho STL. Bạn cũng có thể khởi tạo một vectơ với tham số kích thước. Tôi nghĩ rằng 'std :: vector bar (20);' ví dụ nên phân bổ không gian cho 20 con trỏ nguyên cho mảng đó. – ely

+2

Mã giả mạo như 'for (std :: vector :: size_type i; i user763305

Trả lời

12

.reserve() không thay đổi kích thước của vectơ. Hàm thành viên mà bạn đang tìm kiếm là .resize(). reserve() chỉ đơn giản là một tối ưu hóa. Nếu bạn định thêm một loạt các thứ vào một vectơ bằng cách sử dụng push_back() sau đó cho biết bạn sẽ thêm bao nhiêu bằng cách sử dụng dự trữ() có thể làm cho mã chạy nhanh hơn một chút. Nhưng chỉ cần gọi dự trữ() không thay đổi kích thước.

7

reserve thay đổi dung lượng của véc tơ, chứ không phải kích thước. Bạn có thể muốn resize

6

vector::reserve() thay đổi suất của một véc tơ, không phải kích thướccủa nó.

capacity là số lượng bộ nhớ đã được cấp phát nội bộ để giữ các phần tử của vectơ. size là có bao nhiêu phần tử thực sự được giữ bởi vectơ. vector::resize() ảnh hưởng đến sau.

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