2009-10-08 21 views

Trả lời

18

số Cách duy nhất để thu nhỏ dung lượng của một vector là lừa swap

template< typename T, class Allocator > 
void shrink_capacity(std::vector<T,Allocator>& v) 
{ 
    std::vector<T,Allocator>(v.begin(),v.end()).swap(v); 
} 

và thậm chí là không được bảo đảm để làm việc theo tiêu chuẩn. (Mặc dù rất khó để tưởng tượng một triển khai không hoạt động.)

Theo như tôi biết, phiên bản tiếp theo của tiêu chuẩn C++ (được sử dụng là C++ 0x, nhưng bây giờ đã trở thành C++ 1x) sẽ có std::vector<>::shrink_to_fit().

+1

Tôi sẽ tư vấn rất nhiều về thủ thuật này vì ba lý do: 1. Chức năng không nhất thiết phải làm những gì nó nói. 2 Phá vỡ nguyên tắc "ít ngạc nhiên nhất" 3. Phát sinh một lượng lớn chi phí, có khả năng - không kể đến các tác dụng phụ tiềm tàng của việc sao chép thay vì di chuyển. – einpoklum

+0

@einpoklum: Vâng, điều này là không có di chuyển, và do đó tối ưu hóa ngày hôm nay. Nhưng câu trả lời này gần như là một thập kỷ cũ, vì vậy ... – sbi

+0

@ sbi: Tôi sẽ khuyên bạn nên chống lại nó sau đó :-( – einpoklum

4

Số pop_back() sẽ không thu nhỏ dung lượng của véc tơ. sử dụng std::vector<T>(v).swap(v) để thay thế.

+0

Sao y trả lời của @ sbi; và xem bình luận của tôi ở đó về "mẹo trao đổi". – einpoklum

1

KHÔNG. Tương tự như push_back, pop_back sẽ không ảnh hưởng đến capacity(). Chúng chỉ ảnh hưởng đến size().

EDIT:

tôi nên đã nói push_back sẽ không thay đổi công suất khi v.size() < v.capacity().

2

pop_XXX sẽ không bao giờ thay đổi dung lượng. push_XXX có thể thay đổi dung lượng nếu bạn cố gắng đẩy nhiều thứ hơn dung lượng cho phép.

1

Đây là mã của std :: vector :: pop_back()

void pop_back() 
{ // erase element at end 
    if (!empty()) 
    { // erase last element 
     _Dest_val(this->_Alval, this->_Mylast - 1); 
     --this->_Mylast; 
    } 
} 

Chức năng duy nhất gọi là Destructor và giảm con trỏ tới phần tử cuối cùng. Mã từ VC (Bản phát hành). Vì vậy, nó không ảnh hưởng đến năng lực (hoặc tái phân bổ) của vector.

+1

Một triển khai cụ thể không đủ thông tin để xác định tiêu chuẩn yêu cầu và điều này có thể không thực hiện tương tự mà người hỏi câu hỏi sử dụng. –

4

Dưới C++ 11, người ta có thể gọi shrink_to_fit() để yêu cầu một véc-tơ (cũng như deque hoặc chuỗi) để giảm dung lượng dành riêng cho dung lượng của vectơ. Tuy nhiên, lưu ý rằng điều này phụ thuộc vào việc triển khai thực hiện: nó chỉ là một yêu cầu và không có bất kỳ sự bảo đảm nào. Bạn có thể thử mã sau:

#include <iostream> 
#include <vector> 
using namespace std; 

int main(){ 
    vector<int> myVector; 

    for (auto i=1;i!=1e3;++i) 
     myVector.push_back(i); 

    cout << "Capacity: " << myVector.capacity() << endl; 
    myVector.reserve(2000); 
    cout << "Capacity (after reserving 2000): " << myVector.capacity() << endl; 
    myVector.shrink_to_fit(); 
    cout << "Capacity (after shrink_to_fit): " << myVector.capacity(); 

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