464_____________________Часть III. Современное программирование на C++

int main() f

// Это множество будет упорядочено посредством

// идентификатора STUDENT::id.

STUDENT_SET studentSet;'

studentSet.insert(STUDENT("John Newton", 1.0));

studentSet.insert(STUDENT("Dean Brown", 3.0));

studentSet.insert(STUDENT("Carl Bishop", 2.0));

studentSet.insert(STUDENT("Gary Cook", 1.0));

STUDENT_SET2 studentSet2;

cout .« "Первое множество из " « studentSet.size() Ч>« " студентов (отсортировано по имени):" « endl;

for (STUDENT_SET::iterator i == studentSet.begin();

i != studentSet.end(); i++) ( cout « *i;

studentSet2.insert(*i); // Копируется содержимое StudentSet »

cout « " Первое множество из " « studentSet2.size О ^« " студентов (отсортировано по рейтингу):" « endl;

for (STUDENT_SET2::iterator i = studentSet2 .begin ();

i != studentSet2.end(); i++) cout « *i;

return 0;

}

Итераторы

Итераторы — это ключи, которые нужны алгоритмам для работы с контейнерами. Итераторы подобны указателям, указывающим на объекты в контейнере. Действительно, стандартные указатели C++ могут быть использованы и как итераторы. Операция * в итераторе всегда возвращает значение элемента контейнера, если только итератор указывает на допустимый элемент контейнера. Специальное значение итератора past-the-end указывает на положение за последним элементом в контейнере. В этом случае операция разыменования * в итераторе возвращает неопределенное значение и не имеет смысла. Наиболее часто используемая для всех контейнеров STL функция-член end () помогает выяснить, не достиг ли итератор значения past-the-end. Она возвращает итератор, указывающий на положение за последним элементом в контейнере.

Существуют пять типов итераторов:

• Ввода (input)

• Вывода (output)

• Прямой (forward)

• Двунаправленный (bidiretional)

• Произвольного доступа (random access)