станд.:: вектор изменяет размер вниз

Каждое приложение имеет свой собственный профиль производительности для использования базы данных, и возможности - он, будет изменяться со временем.

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

30
задан Deduplicator 5 July 2018 в 09:50
поделиться

3 ответа

Вызов resize () с меньшим размером не влияет на емкость вектора . Это не освободит память.

Стандартная идиома для освобождения памяти из вектора - это swap () его с пустым временным вектором : ] std :: vector () .swap (vec); . Если вы хотите уменьшить размер, вам нужно будет скопировать исходный вектор в новый локальный временный вектор, а затем заменить полученный вектор исходным.

Обновлено: В C ++ 11 добавлена ​​функция-член shrink_to_fit () для этой цели это необязательный запрос на уменьшение capacity () до size () .

.
44
ответ дан 27 November 2019 в 23:24
поделиться

Фактически, стандарт действительно определяет, что должно произойти:

Это из вектора , но тема одинакова для всех контейнеров ( список , deque и т. Д.)

23.2.4.2 емкость вектора [lib.vector.capacity]

void resize (size_type sz, T c = T ());

6) Эффекты:

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

То есть: если размер, указанный в resize , меньше количества элементов, эти элементы будут удалены из контейнера. Что касается capacity () , это зависит от того, что с ним делает erase () .

Я не могу найти его в стандарте, но почти уверен clear ( ) определяется как:

void clear()
{
    erase(begin(), end());
}

Следовательно, эффекты clear () на capacity () также связаны с эффектами erase () . Согласно стандарту:

23.2.4.3 модификаторы вектора [lib.vector.modifiers]

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

4) Сложность: деструктор T вызывается столько раз, сколько стертых элементов ....

Это означает, что элементы будут разрушены, но память останется нетронутой. erase () не влияет на емкость, поэтому resize () и clear () также не действуют.

но память останется нетронутой. erase () не влияет на емкость, поэтому resize () и clear () также не действуют.

но память останется нетронутой. erase () не влияет на емкость, поэтому resize () и clear () также не действуют.

24
ответ дан 27 November 2019 в 23:24
поделиться

Емкость никогда не уменьшится. Я не уверен, что это явно указано в стандарте, но это подразумевается: итераторы и ссылки на элементы вектора не должны быть аннулированы resize (n) if n .

6
ответ дан 27 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: