#include
#include
#include
using namespace std;
5:
in t main ()
{
/ / Динамический массив целых чисел
vector vecIntegerArray;
1 0 :
/ / Вставить примеры целых чисел в массив
vecIntegerArray.push_back (50);
vecIntegerArray.push_back (2991);
vecIntegerArray.push_back (23);
vecIntegerArray.push_back (9999);
16:
|
|
|
|
|
|
|
17:
|
cout «
|
"The con ten ts
|
of the
|
vector
|
are: "
|
« endl;
|
18:
|
|
|
|
|
|
|
19:
|
/ / Перебор вектора и чтение
|
значений
|
с помощью итератора
|
20:
|
vector
|
< in t> : : ite r a to r
|
iArrayWalker
|
= vecIntegerA rray .begin ();
|
2 1 :
|
|
|
|
|
|
|
22:
|
w hile
|
(iArrayWalker !=
|
vecIntegerA rray . end
|
())
|
{
/ / Вывод значения на экран
cout << *iArrayWalker << endl;
/ / Инкремент итератора для доступа к следующему элементу
++ iArrayWalker;
}
Взаимодействие контейнеров и алгоритмов с использованием итераторов
|
385
|
vector ::iterator iElement = find (vecIntegerArray.begin()
23: , vecIntegerArray.end (), 2991);
24:
// Проверить, найдено ли значение
if (iElement != vecIntegerArray.end ())
{
// Значение найдено... Определить позицию в массиве:
int Position = distance (vecIntegerArray.begin (), iElement);
cout « "Value " « *iElement;
41: cout « " found in the vector at position: " « Position
endl;
}
return 0;
}
Результат
The contents of the vector*are:
50
2991
23
9999
Value 2991 found in the vector at position: 1
Анализ
листинге 15.1 показано применение итераторов при переборе вектора и взаимодей-ствие с ним, позволяющее применить такие алгоритмы, как f in d , к таким контейнерам, как v e c to r . Объект итератора iA rra y W a lk e r объявляется в строке 20 и инициализирует ся началом контейнера, т.е. возвращаемым значением функции-члена b e g in () контейнера
e c to r . Строки 22 -29 демонстрируют использование этого итератора в цикле для поис ка и отображения элементов вектора таким же способом, как и в статическом массиве. Итераторы используются соверш енно одинаково со всеми контейнерами STL. Все они предоставляют функцию b e g in (), указывающую на первый элемент, и функцию en d (),
указывающую на конец контейнера после последнего элемента. Вот почему цикл w h ile в строке 22 останавливается на элементе перед указанным функцией en d (), а не на нем. В строке 32 показано использование алгоритма f i n d для поиска значения в контейнере v e c to r . Результат операции поиска — это итератор, а успех ее выполнения проверяется при сравнении итератора с концом контейнера, как можно заметить в строке 36. Если эле мент найден, то он может быть отображен при обращении к значению этого итератора (как
указателя). Алгоритм d i s t a n c e () применяется при вычислении позиции (смещения) найденного элемента.
Если не глядя заменить в листинге 15.1 все слова 'v e c t o r ' словом ' d e q u e ', его код все еще будет компилироваться и прекрасно работать. Это демонстрация простоты работы итераторов с алгоритмами и контейнерами.
* 3 Зак. 3626
386 ЗАНЯТИЕ 15. Введение в стандартную библиотеку шаблонов
С++11____________________________________________
Использование ключевого слова auto позволяет компилятору определить тип
листинге 15.1 показано несколько объявлений итератора. Они выглядят подобно этому:
vector ::iterator iArrayWalker = vecIntegerArray.begin ();
Определение типа итератора выглядит пугающе. Если вы используете компилятор, со вместимый со стандартом C++11, то можете упростить эту строку до следующей:
auto iArrayWalker = vecIntegerArray.begin (); // тип обнаруживает
компилятор
Обратите внимание, что переменную, объявленную как тип a u to , необходимо инициа лизировать (именно по этому инициализирующему значению компилятор может обнару жить тип).
т
Классы строк библиотеки STL
Библиотека STL предоставляет шаблон класса, специально предназначенного для стро ковых операций. Ш аблон s t d : : b a s i c _ s t r i n g <Т> используется обычно в двух своих специализациях.
■
■
s t d : : s t r i n g . Специализация шаблона s t d : : b a s i c _ s t r i n g для типа c h a r, исполь
зуемая для манипуляций с простыми символьными строками.
s t d : :w s tr in g . Специализация шаблона s t d : : b a s i c _ s t r i n g для типа w c h a r_ t, ис
пользуемая для манипуляций с широкими символьными строками.
Эти вспомогательные классы подробно обсуждается на занятии 16, “Классы строк би блиотеки STL”, где вы увидите, насколько они упрощают работу со строками.
Резюме
На сегодняшнем занятии рассматривались такие концепции библиотеки STL, как кон тейнеры, итераторы и базовые алгоритмы. Вы познакомились с шаблоном b a s i c _ s t r i n g <Т>, который подробно обсуждается на следующем занятии. Контейнеры, итераторы и алгоритмы — это одна из самых важных концепций библиотеки STL, и их полное пони мание поможет вам эффективно использовать библиотеку STL в своем приложении. Более подробная информация по этим концепциям и применению их реализации приведена на занятиях 17-25.
Do'stlaringiz bilan baham: |