В этой статье и последующих, я постараюсь рассказать обо всех функция для работы с векторами. Поскольку вектора это динамический массив, то они могут иметь тот же тип, что и обычный массив, т. е. int, double, char и т. д. Сначала хотел порекомендовать, как правильно характеризовать вектора (т. е. присваивать им имена), например, есть такой код:
vector <int> array; int array1[10];
Если Ваш код короткий (не превышает 50-100 строк), то Вы скорее всего в нем не запутаетесь, но если он больше 300 строк, то становится, очень тяжело в нем разобраться. Стоит осмысленно присваивать имена переменным. Поэтому я предлагаю инициализировать вектора примерно так:
vector <int> vecIntAge; vector <string> vecStrName;
или, что-то подобное этому. Сначала должен идти префикс vec (если Вы используете list, deque… соответственно list, deque, можно сокращенно), потом тип и напоследок имя. Итак, теперь по теме векторов. Вектора можно представлять не только в виде одномерного массива, но также и в виде двухмерного массива или говоря иначе, матрицей. Пример:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<string>vecStr1{{'a','b','c','d'},///объявили вектор №1
{'e','f','g','h'},
{'i','j','k','l'}};
cout<<"vecStr1 contains:\n";
for(int y=0;y<vecStr1.size();++y)
{
for(int x=0;x<vecStr1[y].length();++x)
{
cout<<vecStr1[y][x]<<ends;
}
cout<<endl;
}
vector<string>vecStr2;///объявили вектор №2
vecStr2.push_back("abcd");
vecStr2.push_back("efgh");
vecStr2.push_back("ijkl");
cout<<endl;
cout<<"vecStr2 contains: \n";
for(int y=0;y<vecStr2.size();++y)
{
for(int x=0;x<vecStr2[y].length();++x)
{
cout<<vecStr2[y][x]<<ends;
}
cout<<endl;
}
return 0;
}
Пример работы программы:
В строках 7-9 и 20 объявили вектора, только вектор vecStr1 инициализирован явно, а vecStr2 просто объявлен. В Строках 21-23 в конец вектора при помощи функции push_back() добавляются строки. Как видите вывод вектора vecStr1 и vecStr2 осуществляется, так же как и вывод двумерного массива (матрицы), т. е. для доступа к любому элементу вектора нужно всего лишь указать его координаты по x и y. У векторов есть еще масса преимуществ перед «простыми» массивами, пример:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int arrayInt[10];
vector <int> vecInt(10);///вектор размером на 10 элементов
for(int i=0;i<10;++i)///заполнение массива из 10 элементов числом 1
{
arrayInt[i]=1;
}
vecInt.assign(10,1);///заполнение вектора из 10 элементов числом 1
cout<<"Array contains: ";
for(int i=0;i<10;++i) cout<<arrayInt[i]<<ends;
cout<<endl<<endl;
cout<<"Vector contains: ";
for(int i=0;i<10;++i) cout<<vecInt.at(i)<<ends;///вывод на экран
cout<<endl;
return 0;
}
Пример работы программы:
Как мы видим из данного примера, для заполнения массива одним числом требуется написать целый цикл, строки 9-12, а для заполнения вектора, нужна всего одна строка 14. Для вывода вектора на экран использовалась функция vector::at() которая в данном случае равносильна записи vecInt[i]; Используя вектора их можно инвертировать (производить реверс), как, показано в следующем примере.
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int>::iterator it;///создаем итератор it
vector<int>vecInt(10);///выделили место под 10 элементов
cout<<"Vector contains: ";
for(int i=0;i<10;++i) vecInt[i]=i;
for(it=vecInt.begin();it<vecInt.end();++it)
{
cout<<*it<<ends;///вывод на экран вектора
}
cout<<endl;
cout<<"\nVector capacity: "<<vecInt.capacity();
cout<<endl<<endl;
///реверс вектора
cout<<"Vector revers: ";
for(auto rit=vecInt.rbegin();rit<vecInt.rend();++rit)
{
cout<<*rit<<ends;
}
cout<<endl;
vecInt.clear();///очистили вектор
cout<<"\nVector size: "<<vecInt.size();///размер вектора
cout<<endl;
return 0;
}
Пример работы программы:
В 8 строке создаем итератор it, строки 9-11 Вам должны быть понятны. В строках 13-16 используя итератор it, осуществляем вывод нашего вектора на экран. В строке 18 используется функция vector::capacity() которая возвращает количество элементов, которое может содержать вектор до того, как ему потребуется выделить больше места. В строке 23-26 используя функции vector::rbegin() и vector::rend() мы осуществляем инвертирование вектора или иными словами реверс. Обратите внимание на использование auto (оно введено в стандарт с++11, если Ваш компилятор не поддерживает этот стандарт, будет выдано сообщение об ошибке), о нем будет рассказано более подробно в дальнейшем. В строке 28 осуществляется полная очистка вектора с помощью функции vector::clear().
Комментарии
Tordek
В чем различие между методами size() и capacity()?
Rostik Morozyuk
Що означає ends?
Eho
Еще было бы неплохо, сказать об интераторах.