понедельник, 13 июня 2011 г.

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

Кроме массивов в 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();
Еще немного полезных функций:
  • test.at(i) - равносильно записи test[i], но при этом, если i-ого элемента не существует, программа не вылетит:)
  • test.asign(n,m) - записывает в массив n элементов со значением m
  • test.asign(start,end) - записывает в вектор значения от start до end. Внимание!!! start и end - интераторы (указатели) на элементы другого вектор.
  • test.front() - возвращает ссылку на первый элемент
  • test.back() - возвращает ссылку на последний элемент
  • test.begin() - возвращает интератор первого элемента вектора
  • test.end() - последнего + 1
  • test.clear() - очищает вектор
  • test.erase(i) или test.erase(start,end) - удаляет элемент с итератором i или элементы с интераторами между старт и енд
  • test.size() - возвращает количество элементов в векторе
  • test.swap(test2) - меняет местами содержимое вектора test и  вектора test2
  • test.insert(a,b) - вставляет в test переменную b перед элементом с интератором a и возвращает интератор вставленного элемента
  • test.insert(a,n,b) - вставляет n копий b
  • test.insert(a,start,end) - вставляет элементы между между итераторами start и end перед a
После прочтения этого куска текста у вас наверняка возник вопрос, а что собственно итератор и как ими пользоваться.

Итераторы

Итераторы являются собой, можно сказать, указателями на переменную. Они знают, где находится необходимая нам переменная и могут "добыть" её из памяти. Итераторы в основном используются для операция с элементами контейнеров: сортировка, поиск, копирование и т.д. Для создание итератора необходимо написать имя контейнера <тип данных> :: 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];
И вывести результат работы в текстовый файл

Комментариев нет:

Отправить комментарий