2015-03-20 5 views
5

Когда вектор C++ динамически уменьшает свой распределенный размер на практике.C++ vector уменьшить размер выделения

Я знаю, что выделенное пространство удваивается при вставке в полный вектор, но мне непонятно, когда распределение уменьшается. Классический гистерезис состоит в том, чтобы уменьшить размер распределения при удалении из 1/4-полного вектора.

+1

стандарт не мандат на удвоение возможностей по перераспределению. Это означает только, что рост должен быть геометрическим для достижения амортизации постоянной времени. Но для этого будет претендовать любой фактор роста α> 1. – 5gon12eder

ответ

7

Он никогда не будет сокращать выделенную память в отсутствие явного направления для этого.

В C++ 11 есть вызов shrink_to_fit, который попросит реализацию выполнить это, но может не уменьшить выделенную память. В предыдущих версиях вам нужно создать новую копию и заменить старый.

+3

даже 'shrink_to_fit' не гарантирует снижение емкости (это необязательный запрос). – vsoftco

+1

Техника «предыдущих версий» обычно будет иметь форму 'std :: vector (vec) .swap (vec);' –

+2

@DrewDormann: [И они _still_ не имеют никакой гарантии!] (Http: // stackoverflow .com/q/7829018/560648) –

2

По крайней мере, в моем компиляторе векторы не уменьшают выделенное пространство. Когда я бегу:

 std::vector<int> v; 
     for(unsigned x=0;x<20;++x) 
     { 
      v.push_back(x); 
      out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl; 
     } 
     for(unsigned x=v.size();x>0;--x) 
     { 
      v.pop_back(); 
      out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl; 
     } 

Что возвращает:

elements: 1, capacity: 1 
    elements: 2, capacity: 2 
    elements: 3, capacity: 4 
    elements: 4, capacity: 4 
    elements: 5, capacity: 8 
    elements: 6, capacity: 8 
    elements: 7, capacity: 8 
    elements: 8, capacity: 8 
    elements: 9, capacity: 16 
    elements: 10, capacity: 16 
    elements: 11, capacity: 16 
    elements: 12, capacity: 16 
    elements: 13, capacity: 16 
    elements: 14, capacity: 16 
    elements: 15, capacity: 16 
    elements: 16, capacity: 16 
    elements: 17, capacity: 32 
    elements: 18, capacity: 32 
    elements: 19, capacity: 32 
    elements: 20, capacity: 32 
    elements: 19, capacity: 32 
    elements: 18, capacity: 32 
    elements: 17, capacity: 32 
    elements: 16, capacity: 32 
    elements: 15, capacity: 32 
    elements: 14, capacity: 32 
    elements: 13, capacity: 32 
    elements: 12, capacity: 32 
    elements: 11, capacity: 32 
    elements: 10, capacity: 32 
    elements: 9, capacity: 32 
    elements: 8, capacity: 32 
    elements: 7, capacity: 32 
    elements: 6, capacity: 32 
    elements: 5, capacity: 32 
    elements: 4, capacity: 32 
    elements: 3, capacity: 32 
    elements: 2, capacity: 32 
    elements: 1, capacity: 32 
    elements: 0, capacity: 32 
+0

они автоматически не уменьшают емкость по причинам оптимизации (требуется время). – vsoftco

0

Befor C++ 11 вы можете опорожнить вектор, присвоив ему новое значение:

vector<int> x; 
x.resize(500); 
x = vector<int>(); // assigning a copy of new empty vector will shrink memory usage 
Смежные вопросы