C ++ std :: векторная память / распределение - PullRequest
1 голос
/ 04 мая 2010

С на предыдущий вопрос о векторной емкости , мистер Бэйли сказал:

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

Итак, если я правильно понимаю, чтобы гарантировать, что перераспределение не произойдет, пока не будет превышена емкость, я должен сделать резерв дважды? Не могли бы вы уточнить это?

Я использую вектор в качестве стека памяти следующим образом:

std::vector<double> memory;
memory.reserve(size);
memory.insert(memory.end(), matrix.data().begin(), matrix.data().end()); // smaller than size
memory.resize(memory.capacity(), 0);

Мне нужно гарантировать, что перераспределение не произойдет в вышеприведенном.

спасибо.

ps: я также хотел бы знать, есть ли лучший способ управлять стеком памяти аналогичным образом, кроме вектора

Ответы [ 3 ]

4 голосов
/ 04 мая 2010

Я думаю, что вы читаете утверждение неправильно. Резерву разрешено устанавливать capacity на большую сумму, чем та, которую вы зарезервировали. Специальный язык позволяет перераспределять реализацию, если вы резервируете больше, чем в прошлый раз, но до того, как достигли текущей емкости.

0 голосов
/ 04 мая 2010

Вам не нужно звонить reserve дважды.

Кроме того, в приведенном примере кода вы звонили reserve только один раз. На самом деле код, который вы вставляете, влияет на size вектора. См. 23.3.6.2.11 (C ++ 0x FCD) о влиянии void resize(size_type sz, const T& c);:

if (sz > size())
    insert(end(), sz-size(), c);
else if (sz < size())
    erase(begin()+sz, end());
else
     ; // do nothing

Таким образом, в основном, когда вы звоните memory.resize(memory.capacity(), 0), вы, по сути, добавляете 0, memory.capacity() - memory.size() раз после вашего звонка на memory.insert.

0 голосов
/ 04 мая 2010

Перераспределяет, когда нужно больше. Вам не нужно бронировать дважды. Рекомендуется использовать резервирование, если вы делаете много вставок и хорошо знаете размер хранимой информации. Это намного быстрее.

...