C++ для начинающих - страница 26

стр.

Разумеется, вектор реализован в виде шаблона класса. Так, мы можем написать


>vectorint ivec(10);

>vectorstring svec(10);


Есть два существенных отличия нашей реализации шаблона класса Array от реализации шаблона класса vector. Первое отличие состоит в том, что вектор поддерживает как присваивание значений существующим элементам, так и вставку дополнительных элементов, то есть динамически растет во время выполнения, если программист решил воспользоваться этой его возможностью. Второе отличие более радикально и отражает существенное изменение парадигмы проектирования. Вместо того чтобы поддержать большой набор операций-членов, применимых к вектору, таких, как sort(), min(), max(), find()и так далее, класс vector предоставляет минимальный набор: операции сравнения на равенство и на меньше, size() и empty(). Более общие операции, перечисленные выше, определены как независимые обобщенные алгоритмы.

Для использования класса vector мы должны включить соответствующий заголовочный файл.


>#include vector

>// разные способы создания объектов типа vector

>vectorint vec0; // пустой вектор


>const int size = 8;

>const int value = 1024;


>// вектор размером 8

>// каждый элемент инициализируется 0

>vectorint vec1(size);


>// вектор размером 8

>// каждый элемент инициализируется числом 1024

>vectorint vec2(size,value);


>// вектор размером 4

>// инициализируется числами из массива ia

>int ia[4] = { 0, 1, 1, 2 };

>vectorint vec3(ia,ia+4);


>// vec4 - копия vec2

>vectorint vec4(vec2);


Так же, как наш класс Array, класс vector поддерживает операцию доступа по индексу. Вот пример перебора всех элементов вектора:


>#include vector

>extern int getSize();


>void mumble()

>{

>int size = getSize();

>vectorint vec(size);


>for (int ix=0; ixsize; ++ix)

>vec[ix] = ix;

>// ...

>}


Для такого перебора можно также использовать итераторную пару. Итератор – это объект класса, поддерживающего абстракцию указательного типа. В шаблоне класса vector определены две функции-члена – begin() и end(), устанавливающие итератор соответственно на первый элемент вектора и на элемент, который следует за последним. Вместе эти две функции задают диапазон элементов вектора. Используя итератор, предыдущий пример можно переписать таким образом:


>#include vector

>extern int getSize();


>void mumble()

>{

>int size = getSize();

>vectorint vec(size);


>vectorint::iterator iter = vec.begin();


>for (int ix=0; iter!=vec.end(); ++iter, ++ix)

>*iter = ix;


>// ...

>}


Определение переменной iter


>vectorint::iterator iter = vec.begin();


инициализирует ее адресом первого элемента вектора vec. iterator определен с помощью typedef в шаблоне класса vector, содержащего элементы типа int. Операция инкремента


>++iter


перемещает итератор на следующий элемент вектора. Чтобы получить сам элемент, нужно применить операцию разыменования:


>*iter


В стандартной библиотеке С++ имеется поразительно много функций, работающих с классом vector, но определенных не как функции-члены класса, а как набор обобщенных алгоритмов. Вот их неполный перечень:

алгоритмы поиска: find(), find_if(), search(), binary_search(), count(), count_if();

алгоритмы сортировки и упорядочения: sort(), partial_sort(), merge(), partition(), rotate(), reverse(), random_shuffle();

алгоритмы удаления: unique(), remove();

численные алгоритмы: accumulate(), partial_sum(), inner_product(), adjacent_difference();

алгоритмы генерации и изменения последовательности: generate(), fill(), transform(), copy(), for_each();

алгоритмы сравнения: equal(), min(), max().

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


>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():