}
_________________
320 стр. Часть 5. Полезные особенности
В этом примере определена переменная names, являющаяся списком объектов string. Программа начинает работу с чтения вводимого пользователем списка имён . Каждое введённое имя добавляется к концу списка с помощью метода push_back( ). Цикл завершается, когда пользователь вводит имя "х". Затем список имён сортируется при помощи метода sort( ) .
Программа выводит отсортированный список имён , удаляя объекты с начала списка до тех пор, пока он не станет пустым.
Вот пример вывода данной программы.
Введите имя ( или х для завершения )
Igor
Ira
Anton
х
Отсортированный список:
Anton
Igor
Ira
Press any key to continue...
Контейнер list предоставляет программисту массу различных возможностей, простейшие из которых — insert, swap и erase. Контейнер также позволяет программисту осуществлять итерации по списку с выполнением пользовательской функции над каждым элементом списка.
Однако список не в состоянии обеспечить произвольный доступ к своим элементам. Поскольку объекты могут быть связаны в произвольном порядке, не существует быстрого способа обратиться к n-ому элементу.
►Итераторы...321
В представленной в предыдущем разделе программе для прохода по списку использован деструктивный метод: метод pop_front( ) позволяет пользователю пройти по всему списку, удаляя всякий раз первый объект в списке.
Проход по массиву обычно осуществляется программистом с использованием индекса массива — но такой способ в случае списка неприменим. Можно представить решение, основанное на использовании методов типа getFirst( ) и getNext( ), однако разработчики STL хотели обеспечить обобщённый метод прохода по элементам контейнера, который работал бы для любого вида контейнера. Этой цели служат итераторы STL.
Итератор представляет собой объект, который указывает на объекты, содержащиеся в контейнере. В общем случае итераторы поддерживают следующие функции.
■■■
■ Класс может вернуть итератор, который указывает на первый член коллекции.
■ Итератор можно переместить от одного элемента к следующему.
■ Программа может обратиться к элементу, на который указывает итератор.
■■■
Код, требуемый для обхода списка list, отличается от кода обхода вектора vector. Однако итераторы скрывают эти детали, унифицируя обход любого контейнера с точки зрения программиста.
_________________
321 стр. Глава 28. Стандартная библиотека шаблонов
Приведённая далее программа использует итератор для обхода списка STL недеструктивным образом.
/* STLListUserClass — использование списка STL для */
/* хранения и сортировки объектов */
/* пользовательского класса */
#include <list>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
/* Student — пример пользовательского класса */
class Student
{
public :
Student( char* pszName , int id )
{
name = new string( pszName ) ;
ssID = id ;
}
string* name ;
int ssID ;
} ;
/* Данная функция требуется для поддержки сортировки */
bool operator<( Student& s1 , Student& s2 )
{
return s1.ssID < s2.ssID ;
}
/* Определение коллекции студентов */
list <Student> students ;
int main( int argc , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */