Контейнеры STL: vector. Часть 3




контейнеры STL C++ , Standard Template Library, вектор с++, vector c++

В предыдущем уроке мы определили переменную типа vector<float>, как эквивалент массива, размер которого мы сможем произвольно изменять по ходу выполнения кода. Но это не означает (так же как и для классических векторов C++), что мы можем таким образом создавать только динамические массивы простейших встроенных типов. Тип элемента вектора может быть произвольным и сколь угодно сложным! Например, мы могли бы описать студенческую группу так:

контейнеры STL C++ , Standard Template Library, вектор с++, vector c++

В этом примере, помимо прочего, мы применили указатель this и перегрузку операторов. Оставляю ссылки для вас, если кому-то необходимо освежить это в памяти.

Шаблонным классом вектора (и любого контейнера STL) может быть, в свою очередь, контейнер STL. Например vector< vector<int> > или vector< vector< vector<int> > > (не забудьте пробел между закрывающимися скобками ‘>‘ — это особенность синтаксического разборщика). Таким образом мы можем, например, создать класс треугольных матриц:

контейнеры STL C++ , Standard Template Library, вектор с++, vector c++
Следующим уровнем нашего углубления в технику векторов, и контейнеров STL вообще, будет понятие итератора. Итератор — центральное понятие для работы с контейнерами STL. Итератор – это некоторая абстракция, которая применяется для выполнения итерации (перебора) элементов в контейнере STL и предоставления доступа к отдельным элементам. Итератор p не является указателем, но, на первых порах, вы можете условно считать его как нечто подобное по виду: *p будет обозначать значение данных под текущим итератором, p++ переводит итератор на следующий элемент контейнера, а p– (когда это допустимо) — на предыдущий элемент. Для разных типов контейнеров, соответствующие им итераторы могут относиться к одной из 5-ти категорий: входные, выходные, однонаправленные, двунаправленные и произвольного доступа. Итераторы векторов — это итераторы прямого доступа. Именно поэтому для векторов возможна операция индексации. Этих, достаточно поверхностных, знаний про итераторы нам достаточно для того, чтобы начать работать с ними.

Воспроизведём в терминах итераторов задачу нахождения всех простых чисел, не превосходящих N (решето Эратосфена), которую мы уже решали раньше в технике массивов C++:

Как легко видеть из описания vector<bool>::iterator, что итератор хранит в себе вид контейнера, к которому относится, и тип элементов этого контейнера. Это требует достаточно громоздкой записи с точным описанием типа итератора. Но последний стандарт C++11 ввёл понятие выводимости типа: если требуемый тип объекта выводится из контекста его использования, то тип объекта может быть объявлен описателем auto (выводимый тип). Тогда строка 16 показанного выше кода может быть записана так:

Наконец, для векторов (и для всех контейнеров, имеющих двунаправленные итераторы, как упоминалось выше) могут быть определены реверсные итераторы, которые перемещаются не от начала контейнера к концу, а наоборот — с конца в начало. Такой итератор должен объявляться как совсем другой тип, например:

Но и здесь мы можем положиться на выведение типов, как в следующем примере:

контейнеры STL C++ , Standard Template Library, вектор с++, vector c++

Все возникающие вопросы по уроку задавайте в комментариях.

Рассылка новых уроков по программированию:

Контейнеры STL: vector. Часть 3
5 (100%) 2 votes

Об авторе Olej

Стаж практических программных разработок около 40 лет. Преподаватель международной софтверной компании Global Logic. Постоянный автор публикаций IBM Developer Works. Научный редактор книжного издательства компьютерной литературы "Символ-Плюс", Санкт-Петербург.

Контейнеры STL: vector. Часть 3: 2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *