2.8. Стандартный массив - это векторХотя встроенный массив формально и обеспечивает механизм контейнера, он, как
мы видели выше, не поддерживает семантику абстракции контейнера. До принятия
стандарта C++ для программирования на таком уровне мы должны были либо приобрести
нужный класс, либо реализовать его самостоятельно. Теперь же класс массива является
частью стандартной библиотеки C++. Только называется он не массив, а вектор. vector<int> ivec(10); vector<string> svec(10); Есть два существенных отличия нашей реализации шаблона класса Array от реализации
шаблона класса vector. Первое отличие состоит в том, что вектор поддерживает
как присваивание значений существующим элементам, так и вставку дополнительных
элементов, то есть динамически растет во время выполнения, если программист
решил воспользоваться этой его возможностью. Второе отличие более радикально
и отражает существенное изменение парадигмы проектирования. Вместо того чтобы
поддержать большой набор операций-членов, применимых к вектору, таких, как sort(),
min(), max(), find()и так далее, класс vector предоставляет минимальный набор:
операции сравнения на равенство и на меньше, size() и empty(). Более общие операции,
перечисленные выше, определены как независимые обобщенные алгоритмы. #include <vector> // разные способы создания объектов типа vector Так же, как наш класс Array, класс vector поддерживает операцию доступа по индексу. Вот пример перебора всех элементов вектора: #include <vector> extern int getSize(); Для такого перебора можно также использовать итераторную пару. Итератор – это объект класса, поддерживающего абстракцию указательного типа. В шаблоне класса vector определены две функции-члена – begin() и end(), устанавливающие итератор соответственно на первый элемент вектора и на элемент, который следует за последним. Вместе эти две функции задают диапазон элементов вектора. Используя итератор, предыдущий пример можно переписать таким образом: #include <vector> extern int getSize(); Определение переменной iter vector<int>::iterator iter = vec.begin(); инициализирует ее адресом первого элемента вектора vec. iterator определен с помощью typedef в шаблоне класса vector, содержащего элементы типа int. Операция инкремента ++iter перемещает итератор на следующий элемент вектора. Чтобы получить сам элемент, нужно применить операцию разыменования: *iter В стандартной библиотеке С++ имеется поразительно много функций, работающих
с классом vector, но определенных не как функции-члены класса, а как набор обобщенных
алгоритмов. Вот их неполный перечень: sort ( ivec.begin(), ivec.end() ); Чтобы применить алгоритм sort() только к первой половине вектора, мы напишем: sort ( ivec.begin(), ivec.begin() + ivec.size()/2 ); Роль итераторной пары может играть и пара указателей на элементы встроенного массива. Пусть, например, нам дан массив: int ia[7] = { 10, 7, 9, 5, 3, 7, 1 }; Упорядочить весь массив можно вызовом алгоритма sort(): sort ( ia, ia+7 ); Так можно упорядочить первые четыре элемента: sort ( ia, ia+4 ); Для использования алгоритмов в программу необходимо включить заголовочный файл #include <algorithm> Ниже приведен пример программы, использующей разнообразные алгоритмы в применении к объекту типа vector: #include <vector> #include <algorithm> #include <iostream> Стандартная библиотека С++ поддерживает и ассоциативные массивы. Ассоциативный массив – это массив, элементы которого можно индексировать не только целыми числами, но и значениями любого типа. В терминологии стандартной библиотеки ассоциативный массив называется отображением (map). Например, телефонный справочник может быть представлен в виде ассоциативного массива, где индексами служат фамилии абонентов, а значениями элементов – телефонные номера: #include <map> #include <string> #include "TelephoneNumber.h" map<string, telephoneNum> telephone_directory; (Классы векторов, отображений и других контейнеров в подробностях описываются
в главе 6. Мы попробуем реализовать систему текстового
поиска, используя эти классы. В главе 12 рассмотрены
обобщенные алгоритмы, а в Приложении приводятся примеры их использования.) Упражнение 2.22Поясните результаты каждого из следующих определений вектора: string pals[] = { "pooh", "tiger", "piglet", "eeyore", "kanga" }; (a) vector<string> svec1(pals,pals+5); (b) vector<int> ivec1(10); (c) vector<int> ivec2(10,10); (d) vector<string> svec2(svec1); (e) vector<double> dvec; Упражнение 2.23Напишите две реализации функции min(), объявление которой приведено ниже. Функция
должна возвращать минимальный элемент массива. Используйте цикл for и перебор
элементов с помощью Содержание |
Нет комментариев. Оставить комментарий: |