Упражнение 9.24. Напишите программу, которая обращается к первому элементу вектора, используя функции at(), front() и begin(), а также оператор индексирования. Проверьте программу на пустом векторе.
Подобно тому, как существует несколько способов добавления элементов в контейнер (исключая array), существует несколько способов их удаления. Функции удаления перечислены в табл. 9.7.
Таблица 9.7. Функции удаления последовательных контейнеров
Эти функции изменяют размер контейнера; они не поддерживаются массивами. Контейнер forward_list обладает специальной версией функции erase(); см. раздел 9.3.4, а функции pop_back() у него нет. Функция pop_front() недопустима для контейнеров vector и string. | |
|---|---|
c.pop_back() | Удаляет последний элемент контейнера c. Результат непредсказуем, если контейнер c пуст. Возвращает void |
c.pop_front() | Удаляет первый элемент контейнера с. Результат непредсказуем, если контейнер с пуст. Возвращает void |
c.erase(p) | Удаляет элемент, обозначенный итератором p. Возвращает итератор на элемент после удаленного или p обозначает последний элемент. Результат непредсказуем, если итератор p указывает на следующий элемент после последнего |
c.erase(b,е) | Удаляет диапазон элементов, обозначенных итераторами b и е. Возвращает итератор на элемент после последнего удаленного или после последнего элемента контейнера, если итератор е указывал на последний элемент |
c.clear() | Удаляет все элементы контейнера с. Возвращает void |
pop_front() и pop_back()Функции pop_front() и pop_back() удаляют, соответственно, первый и последний элементы контейнера. Векторы и строки функциями push_front() и pop_front() не обладают. У контейнера forward_list также нет функции pop_back(). Подобно функциям-членам доступа к элементам, эти функции не применимы к пустому контейнеру.
Удалив соответствующий элемент, эти функции возвращают тип void. Если необходимо извлечь элемент, то следует сохранить его значение перед удалением:
while (!ilist.empty()) {
process(ilist.front()); //
ilist.pop_front(); //
}
Функции-члены удаления удаляют элемент (элементы) в указанной позиции контейнера. Можно удалить как отдельный элемент, обозначенный итератором, так и диапазон элементов, отмеченных парой итераторов. Обе формы функции erase() возвращают итератор на область
В качестве примера рассмотрим следующий цикл, удаляющий нечетные элементы списка:
list
auto it = lst.begin();
while (it != lst.end())
if (*it % 2) //
it = lst.erase(it); //
else
++it;
На каждой итерации проверяется нечетность текущего элемента. Если это так, то данный элемент удаляется, а итератор it устанавливается на следующий элемент после удаленного. Если элемент *it четный, осуществляется приращение итератора it, чтобы при следующей итерации он указывал на следующей элемент.