Читать «Стандарты программирования на С++. 101 правило и рекомендация» онлайн - страница 128
Андрей Александреску
clear
) с последующими индивидуальными вставками в контейнер.
Ссылки
82. Используйте подходящие идиомы для реального уменьшения емкости контейнера и удаления элементов
Резюме
Для того чтобы действительно избавиться от излишней емкости контейнера, воспользуйтесь трюком с использованием обмена, а для реального удаления элементов из контейнера — идиомой erase
-remove
.
Обсуждение
Некоторые контейнеры (например, vector, string
, deque
) могут иметь "лишнюю" емкость, которая больше не будет использоваться. Хотя стандартная библиотека C++ не предоставляет гарантированного способа для удаления излишней емкости, следующая идиома на практике оказывается вполне работоспособной:
container<T>(c).swap(c); // Идиома "горячей посадки" для
// устранения излишней емкости
// контейнера
Для того чтобы полностью опустошить c
, удалив все элементы и убрав всю емкость, идиома должна выглядеть следующим образом:
container<T>().swap(c); // Идиома для удаления всего
// содержимого и емкости
Кроме того, обычно для новичков в программировании с использованием STL оказывается сюрпризом то, что алгоритм remove
в действительности не удаляет элементы из контейнера. Понятно, что данный алгоритм на это не способен — ведь алгоритм работает только с диапазоном итераторов и не может ничего реально удалить из контейнера без вызова функции-члена контейнера, обычно erase
. Удаление сводится к перемещению элементов, которые должны быть "удалены", и возврату итератора, указывающего на элемент, следующий за последним неудаленным. Для реального удаления элементов из контейнера после вызова remove
следует вызвать erase
— воспользоваться идиомой erase
-remove
. Например, для реального удаления всех элементов, равных value, из контейнера с, можно написать:
c.erase(remove(c.begin(), c.end(), value), c.end());