Вектор емкость и резерв - PullRequest
1 голос
/ 17 мая 2011

Рассмотрим следующий фрагмент кода:

std::vector<int> v;
v.reserve(100);
v.insert(v.end(), 100, 5);

v.erase(v.begin(), v.end());

std::cout << v.capacity << std::endl;

Это распечатывает 100.Означает ли это, что вектор по-прежнему содержит 100 ячеек памяти?Обязательно ли вызывать reserve(0) после вызова erase(begin,end) для вектора, чтобы освободить все пространство, сохраняемое вектором?

Ответы [ 4 ]

5 голосов
/ 17 мая 2011

Если емкость 100, то в vector есть место, выделенное для 100 элементов.reserve(0) не используется, поскольку reserve не будет уменьшать емкость.

reserve(n) будет пытаться увеличить выделение до достаточного пространства для как минимум n элементов.Нет никаких гарантий, что он будет успешным, он не сообщит о сбое и может перераспределить.

Не вызывайте reserve, если вы не измерили свой код с и без него и обнаружили, что это имеет существенное значение,Любое другое использование reserve является преждевременной оптимизацией.

2 голосов
/ 17 мая 2011

В качестве напоминания, C ++ 0x / 11 добавил удобную функцию shrink_to_fit в контейнер STL, который уже доступен в VS2010, так что вам повезло, если вы пишете код в Windows (с VS). :)

2 голосов
/ 17 мая 2011

Вы ищете (в) знаменитый трюк подкачки:

vector<T>().swap(myVector);

Смотрите здесь для фона

Как уменьшить std :: vector?

1 голос
/ 17 мая 2011

Да, вектор по-прежнему содержит 100 локаций. reserve используется только для увеличения размера и не может его уменьшить. reserve(0); вызов не будет иметь никакого эффекта вообще. В C ++ 1x я верю, что будет shrink_to_fit вызов, который вас интересует.

В текущем стандарте вы должны использовать трюк подкачки для освобождения памяти, выделенной вектором, но прежде чем сделать это, внимательно подумайте, действительно ли вы хотите сделать это. Если вы добавите элементы обратно в вектор позже, вы просто перераспределите. Если вы не используете встроенную систему, просто дайте вектору управлять собственной памятью.

Трюк со свопом: используйте vector<T>().swap(myvector);, чтобы освободить хранилище вектора.

...