Удаление элементов из списка
Функция e r a s e () класса l i s t имеет две перегруженные версии: удаляющую один элемент по переданному итератору, указывающему на него, и удаляющую диапазон эле ментов из списка. В действии функцию l i s t : : e r a s e () можно увидеть в листинге 18.4. где из списка удаляется один элемент или диапазон элементов.
ЛИСТИНГ 18.4. Удаление элементов из списка______________________________________
#include
#include
using namespace std;
template
void DisplayContents(const T& Input)
6 : {
for(auto iElement = Input.cbegin() // auto и cbegin: C++11
8:
|
; iElement
|
!= Input.cend()
|
9:
|
; ++ iElement
|
)
|
10:
|
cout « *iElement
|
«
|
'
|
1 1 :
cout « endl;
}
14:
int main()
{
std::list listlntegers;
// Вставка элементов в вначало и конец...
listlntegers.push_back(4);
listlntegers.push_front(3);
listlntegers.push_back(5);
23:
// Сохранить итератор, полученный при помощи функции insert()
auto iValue2 = listlntegers.insert(listlntegers.begin(), 2);
27: cout « "Initial contents of the list:" « endl;
Обращение списка и сортировка его элементов
|
431
|
DisplayContents(listlntegers);
listlntegers.erase(listlntegers.begin(), iValue2);
cout « "Contents after erasing a range of elements:" « endl;
DisplayContents(listlntegers);
33:
|
cout « "After erasing element ’" « *iValue2 « "':" « endl;
|
34:
|
listlntegers.erase(iValue2);
DisplayContents(listlntegers);
listlntegers.erase(listlntegers.begin(), listlntegers.end());
cout « "Number of elements after erasing range: ";
40:
|
cout « listlntegers.size() «
|
endl;
|
41:
|
|
|
return 0;
}
Результат
Initial contents of the list:
2345
Contents after erasing a range of elements:
2345
After erasing element '2':
3 4 5
Number of elements after erasing range: 0
Анализ
Строки 20 -25 функции m ain () используют различные методы для вставки в список целых чисел. Когда для вставки значений используется метод i n s e r t (), он возвращает итератор на вставленный элемент. В данном случае итератор указывает на элемент со зна чением 2. В строке 25 он сохраняется в переменной iV a lu e 2 и используется позже при вызове функции e r a s e () в строке 35 для удаления этого элемента из списка. Строки 30 и 38 демонстрируют применение метода e r a s e () для удаления диапазона элементов. В пер вом случае удаляется диапазон от b e g in () до элемента, содержащего значение 2 (но не включая его). Во втором случае очищается диапазон от b e g in () до en d (), — фактически удаляется весь список.
Строка 40 листинга 18.4 демонстрирует, что количество элементов списка мо жет быть определено при помощи метода size () класса std::list, как и у вектора. Это применимо ко всем контейнерным классам библиотеки STL.
Обращение списка и сортировка его элементов
списка есть одна особенность: указываю щ ие на элементы в списке итераторы остаются допустимыми, несмотря на перестановку элементов или вставку новых. Для
432 ЗАНЯТИЕ 18. Классы двухсвязного иодносвязного списков библиотеки STL
обеспечения этой особенности класс l i s t предоставляет методы s o r t () и r e v e r s e (). хотя библиотека STL предлагает такие же алгоритмы, вполне способные работать с клас сом l i s t . Эти алгоритмы в версии членов класса гарантируют, что итераторы, указы вающие на элементы в списке, останутся допустимыми при изменении относительной позиции элементов.
Do'stlaringiz bilan baham: |