Я пишу программу, память которой ограничена в зависимости от размера ввода. Скажем, входной размер равен 1000, затем я сохраняю их в векторе размером 1000. Позже, когда я обрабатываю данные в этом векторе, каждый раз, когда элемент обрабатывается, я помещаю его во второй вектор и использую vector.erase, чтобы удалить его из исходного вектора. Поэтому я подумал, что всегда использую 1000 единиц памяти, потому что в этих двух векторах всегда хранится 1000 элементов.
Но я ошибаюсь, оказывается, я использовал 2000 памяти, потому что erase
не уменьшает размер вектора, когда элементы удалены … Я думаю, это то же самое для splice
это?
Так есть ли способ заставить мою программу использовать только 1000 памяти? Я могу решить эту проблему, добавив атрибут и отметив, обработан ли элемент, но я чувствую, что это не лучший способ. Спасибо!
Этот метод, позволяющий уменьшить емкость, можно использовать как в C ++ 03, так и в C ++ 11:
std::vector<int> v;
// ...
std::vector<int>(v.begin(), v.end()).swap(v);
это живой пример содержит демонстрацию. Эффективность метода зависит от того, сколько памяти выделяет реализация при инициализации временного вектора с элементами v
,
В C ++ 11 функция-член shrink_to_fit()
Может быть вызван для выполнения необязательного запроса, чтобы уменьшить емкость вектора до размера, необходимого для хранения элементов, находящихся в данный момент в контейнере.
Заметить, что «необязательного«означает, что стандарт не требует реализации для фактического удовлетворения этого запроса.
C++11
добавил функцию shrink_to_fit()
в std::vector
, Если вы ищете способ уменьшить размер вектора, после удаления элементов из него, это будет путь. Вот больше информации об этом.