Обращение элементов списка с использованием
метода l i s t : : r e v e r s e ()
ункция-член r e v e r s e () класса l i s t не получает никаких параметров и обращает порядок содержимого списка:
listlntegers.reverse(); // обратить порядок элементов
Применение метода r e v e r s e () приведено в листинге 18.5.
ЛИСТИНГ 18.5. Обращение элементов списка
#include
#include
using namespace std;
template
void DisplayContents(const T& Input)
{
for(auto iElement = Input.cbegin() // auto и cbegin: C++11
; iElement != Input.cend()
; ++ iElement )
cout « *iElement « '
cout « endl;
}
int main()
{
std::list listlntegers;
// Вставка элементов в начало и в конец
listlntegers.push_front(4);
listlntegers.push_front(3);
listlntegers.push_front(2);
listlntegers.push_front(1);
listlntegers.push_front(0);
listlntegers.push_back(5);
26
cout « "Initial contents of the list:" « endl;
DisplayContents(listlntegers);
29
listlntegers.reverse();
cout « "Contents of the list after using reverse():" « endl;
DisplayContents(listlntegers);
return 0;
}
Обращение списка и сортировка его элементов
|
433
|
Результат
Initial contents of the list:
012345
Contents of the list after using reverse():
5 43210
Анализ
Как показано в строке 30, метод r e v e r s e () просто обращает порядок элементов спис ка. Это простой вызов без параметров, гарантирующий, что указывающие на элементы итераторы, если они были сохранены, останутся допустимыми.
Сортировка элементов
Функция-член s o r t () класса l i s t не доступна в версии без параметров:
listlntegers.sort(); // сортировеа в порядке возрастания
Другая версия позволяет определять собственные приоритеты сортировки при помощи функции предиката, переданной как параметр:
bool SortPredicate_Descending (const int& lsh, const int& rsh)
{
определение критериев для метода list::sort: возвратить true
для желательного порядка
return (lsh > rsh);
}
Использование предиката для сортировки списка: listlntegers.sort (SortPredicate_Descending);
Эти два варианта представлены в листинге 18.6.
ЛИСТИНГ 18.6. Сортировка списка целых чисел по возрастанию
по убыванию с использованием метода list:: sort ()_____________ __________________
#include
#include
using namespace std;
3:
bool SortPredicate_Descending (const int& lsh, const int& rsh)
{
// определение критериев для метода list::sort: возвратить true // для желательного порядка
return (lsh > rsh);
8 : }
9:
template
void DisplayContents (const T& Input)
12: {
for (auto iElement = Input.cbegin() // auto и cbegin: C++11
; iElement != Input.cend()
; ++ iElement )
cout « *iElement « » i .
17:
434 ЗАНЯТИЕ 18. Классы двухсвязного и односвязного списков библиотеки STL
cout « endl;
}
2 0 :
int main ()
22: {
list listlntegers;
// Вставка элементов в начало и конец
listlntegers.push_front (444);
listlntegers.push_front (2011);
listlntegers.push_front (-1);
listlntegers.push_front (0);
listlntegers.push_back (-5);
31:
cout « "Initial contents of the list are - " « endl;
DisplayContents (listlntegers);
34:
listlntegers.sort ();
cout « "Order of elements after sort():" « endl;
DisplayContents (listlntegers);
39:
listlntegers.sort (SortPredicate_Descending);
41: cout « "Order of elements after sort() with a predicate:
endl;
DisplayContents (listlntegers);
return 0;
}
Результат
Initial contents of the list are -
0 -1 2011 444 -5
Order of elements after sort():
-5 -1 0 444 2011
Order of elements after sort() with a predicate:
2011 444 0 -1 -5
Анализ
Данный пример демонстрирует функциональные возможности сортировки в спи ске целых чисел. В нескольких первых строках кода создается объект списка и запол няется примерами значений. Строка 35 демонстрирует применение функции s o r t () без параметров, что по умолчанию означает сортировку элементов в порядке возрастания: для сравнения целых чисел используется оператор < (который в случае целых чисел реа лизуется компилятором). Но если разработчик захочет переопределить это стандартное поведение, он должен снабдить функцию сортировки бинарным предикатом. Функция S o r t P r e d i c a t e D e sc e n d in g (), определенная в строках 4 -8, является бинарным преди катом, который позволяет функции s o r t () списка решить, является ли один элемент мень ше другого. В противном случае он меняет их позиции. Другими словами, вы указываете списку, что следует интерпретировать как “меньше” (в данном случае первый параметр
Обращение списка и сортировка его элементов
|
435
|
больше второго). Этот предикат передается как параметр функции s o r t () (строка 40). Предикат возвращает значение t r u e , только если первое значение больше второго. Таким образом, использующая предикат функция s o r t () интерпретирует первое значение ( ls h ) как логически меньшее второго (rsh ), только если числовое значение первого больше вто рого. На основе этой интерпретации, согласно определенному предикатом критерию, она меняет позицию элементов.
Сортировка и удаление элементов из списка, который содержит объекты класса
Что, если у вас есть список объектов класса, а не таких простых встроенных типов, как i n t ? Скажем, список записей адресной книги, где каждая запись — объект класса, содержащий имя, адрес и т.д. Как удостовериться, что этот список будет отсортирован по имени?
Решение может иметь два варианта.
Реализуйте в пределах класса, объекты которого содержат список, оператор <.
Предоставьте некий бинарный предикат (binary predicate) — функцию, получающую на входе два значения и возвращающую логическое значение, указывающее, меньше ли первое значение второго.
Реальные приложения, задействую щие контейнеры библиотеки STL, редко хранят целые числа; как правило, это пользовательские типы, такие как классы или структуры. Листинг 18.7 демонстрирует пример списка контактов. На первый взгляд он кажется до вольно длинным, но содержит главным образом простой код.
ИСТИН Г 1 8 .7 . Список объектов класса: создание списка контактов_________________________
Do'stlaringiz bilan baham: |