|
Программирование >> Инициализация объектов класса, структура
разные способы создания объектов типа vector vector<int> vec0; пустой вектор const int size = 8; const int value = 1024; вектор размером 8 кажд элемент инициазируется 0 vector<int> vec1(size); вектор размером 8 емент ин vector<int> vec2(size,value); вектор размером 8 каждый элемент инициализируется числом 1024 вектор размером 4 инициализируется числами из массива ia int ia[4] = { 0, 1, 1, 2 }; vector<int> vec3(ia,ia+4); vec4 - копия vec2 vector<int> vec4(vec2); Так же, как наш класс Array, класс vector поддерживает операцию доступа по индексу. #include <vector> Вот пример перебора всех элементов вектора: extern int getSize(); void mumble() { int size = getSize(); vector<int> vec(size); for (int ix=0; ix<size; ++ix) vec[ix] = ix; ... Для такого перебора можно также использовать итераторную пару. Итератор - это объект класса, поддерживающего абстракцию указательного типа. В шаблоне класса vector определены две функции-члена - begin() и end() , устанавливающие итератор соответственно на первый элемент вектора и на элемент, который следует за последним. Вместе эти две функции задают диапазон элементов вектора. Используя итератор, #include <vector> предыдущий пример можно переписать таким образом: extern int getSize(); void mumble() { int size = getSize(); vector<int> vec(size); vector<int>::iterator iter = vec.begin(); for (int ix=0; iter!=vec.end(); ++iter, ++ix) *iter = ix; ... Определение переменной iter vector<int>::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() : sort ( ia, ia+7 ); Так можно упорядочить первые четыре элемента: sort ( ia, ia+4 ); Для использования алгоритмов в программу необходимо включить заголовочный файл #include <algorithm> Ниже приведен пример программ:, использующей разнообразные алгоритмы в применении к объекту типа vector:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |