Контейнеры 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
Рейтинг
51star1star1star1star1star
Olej

Об авторе Olej

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

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

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

Код размещайте в тегах: <pre class="lang:c++ decode:true ">YOUR CODE</pre>