Главная > Программирование > c++ > C++. Урок 8. STL. Контейнеры. Vector (вектор) – динамический массив

C++. Урок 8. STL. Контейнеры. Vector (вектор) – динамический массив

14.01.2010. c++, Программирование

11

Object moved to here.

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

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

Для создания вектора вам необходимо подключить <vector>. Затем создание вектора почти ничем не отличается от создания переменной и/или массива:

vector <type> name; //здесть type- тип данных в векторе, а name - имя вектора

Для записи в вектор достаточно набрать имя вектора.push_back(что положить)

vector <int> test;

test.push_back(10);

test.push_back(20);

Обращение к n-ому элементу ничем не отличается от обращения к элементу массива:

test[0]++;

cout<<test[1];

test[1]=222;

Для удаления последнего элемента вектора используется функция pop_back()

test.pop_back();

Еще немного полезных функций:

После прочтения этого куска текста у вас наверняка возник вопрос, а что собственно итератор и как ими пользоваться.

Итераторы

Итераторы являются собой, можно сказать, указателями на переменную. Они знают, где находится необходимая нам переменная и могут "добыть" её из памяти. Итераторы в основном используются для операция с элементами контейнеров: сортировка, поиск, копирование и т.д. Для создание итератора необходимо написать имя контейнера <тип данных> :: iterator и имя итератора.

Например,

vector <float>::iterator begin;

string::iterator end,cur;

Да, да. Строки это тоже контейнеры;)

Теперь что мы можем делать с итераторами.

Мы можем получить элемент, на который они ссылаются:

cout<<*cur<<endl;

.
Здесь мы выводим элемент, на который указывает cur. Как вы наверное уже поняли, оператор * позволяет нам обращаться не к итераторы, а к элементу

Мы можем перейти к итераторы на следующий элемент или даже дальше:

cur++; // перейти к следующему элементу

cur+=10; // <=>cur=cur+10 перейти на 10 элементов вперед

Вот, например, вывод всего вектора на экран:

vector <string> test;

//как-то его заполнили

vector<string>::iterator cur;

for (cur=test.begin();cur<test.end();cur++)

cout<<*cur<<endl;

А теперь немного практики.

Во-первых, по изучайте все функции вектора и просмотрите как они работают. Также постарайтесь немного поработать с итераторами.

Во-вторых, попробуйте сделать такую программу:

вам вводят числа, вы их должны сохранить в вектор. Затем применить такую операцию для всех элементов начиная с 2:

a[i]+=a[i-1]*2+a[i]%a[i+1];

И вывести результат работы в текстовый файл

В следующий раз я расскажу об различных алгоритмах, которые можно применять к контейнерам


Метки:

Rambler's Top100 Блогун - монетизируем блоги