2014-11-12 12 views
7

Vectơ tăng gấp đôi kích thước của chúng mỗi khi chúng hết dung lượng khi thêm phần tử, nhưng còn khi bạn xóa phần tử thì sao? nói rằng bạn đã thêm 800 phần tử vào một mảng và khi thêm phần tử thứ 800 đó, vectơ tăng gấp đôi kích thước của nó để có thể chứa 1600 phần tử. Bây giờ điều gì sẽ xảy ra nếu bạn bắt đầu lấy đi các yếu tố đến mức nó chỉ giữ 5 hoặc 10 phần tử?Các vectơ Do (c + +) co lại sau khi các phần tử được lấy ra?

sẽ nhận ra rằng vectơ nhỏ hơn một nửa kích thước của không gian dành riêng cho các yếu tố trong tương lai và dành ít không gian hơn?

+6

Sử dụng 'shrink_to_fit' nếu bạn cần" đảm bảo "điều này (lưu ý rằng * có thể * bị bỏ qua về mặt kỹ thuật, nhưng tôi không nghĩ gì cả). – chris

+1

Câu trả lời ngắn gọn là không - 'erase() 'không giảm' dung lượng() '. –

+1

Và cả hai không rõ ràng() '. – bialpio

Trả lời

6

Vectơ không giảm công suất khi loại bỏ các phần tử! Điều này là để cho phép các yếu tố trong tương lai được thêm hiệu quả vào bộ đệm hiện có.

+0

Đó không phải là cách duy nhất: ' vec.resize (vec.size()); ' bialpio

+0

Rất tiếc, xin lỗi. Bạn nói đúng. – bialpio

+0

Hãy ngừng truyền bá huyền thoại rằng mẹo giảm dung lượng là bất cứ điều gì khác hơn là [giải pháp nỗ lực tốt nhất] (http://stackoverflow.com/q/7829018/560648)! –

1

Nếu nó đã cấp phát một khối bộ nhớ, nó sẽ tiếp tục sử dụng nó vì nó sẽ không hiệu quả để giải phóng bộ nhớ và sau đó tìm nó phải cấp thêm bộ nhớ.

Tôi luôn khuyên bạn nên viết đoạn mã thử nghiệm để kiểm tra những thứ này.

Ví dụ, tôi đã ném này lại với nhau trong vòng 2 phút để xác minh rằng tôi đã nói cho bạn thông tin chính xác:

#include <iostream> 
#include <vector> 

void printInfo(std::vector<char> &_vector) 
{ 
    std::cout << "Size: " << _vector.size() << std::endl; 
    std::cout << "Capacity: " << _vector.capacity() << std::endl; 
    std::cout << std::endl; 
} 

int main() 
{ 
    int numbElems = 10; 
    std::vector<char> myvector; 

    std::cout << "Nothing entered" << std::endl; 
    printInfo(myvector); 

    for (int i = 0; i < 10; i++) { 
    for (int c = 0; c < numbElems; c++) { 
     myvector.push_back(i); 
    } 
    std::cout << "Pushed " << numbElems << std::endl; 
    printInfo(myvector); 
    } 

    for (int i = 0; i < 5; i++) { 
    for (int c = 0; c < numbElems; c++) { 
     myvector.pop_back(); 
    } 
    std::cout << "Popped " << numbElems << std::endl; 
    printInfo(myvector); 
    } 

    myvector.erase(myvector.begin(), myvector.end()); 
    printInfo(myvector); 

    std::cout << "max_size: " << myvector.max_size() << std::endl; 

    return 0; 
} 

Nếu bạn biên dịch và chạy, bạn sẽ thấy Dung không bao giờ đi xuống trong kích thước. Ngay cả sau khi xóa, hoặc một số yếu tố được loại bỏ.

Trên linux, bạn có thể sử dụng less để cuộn qua đầu ra.

+0

Điều đó chứng tỏ nó trên trình biên dịch của bạn. Bạn cần tham khảo spec để chứng minh điều đó. –

+0

Quên đề cập đến điều đó. Tôi đang sử dụng 'g ++' của bộ sưu tập trình biên dịch GNU. Không chắc chắn làm thế nào để từ đó một cách chính xác. Nhưng có, nó phụ thuộc vào việc thực hiện vector. –

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