В вектор можно добавлять элементы с помощью указателей, для этого используется функция vector::data()
. Вывод вектора так же можно осуществить при помощи указателя, пример:
#include <iostream> #include <vector> using namespace std; int main() { vector<int>vecInt(5); int i; int *pointer=vecInt.data();///создание указателя for( i=0;i<5;++i) { pointer[i]=i;///равносильно vecInt[i]=I; } cout<<"First output: "; for(i=0;i<5;++i) { cout<<pointer[i]<<ends;///равносильно vecInt[i]; } cout<<endl; cout<<"Second output: "; for(i=0;i<5;++i) { cout<<*pointer<<ends; pointer++; } cout<<endl; cout<<"Third output: "; for(i=0;i<5;++i) { cout<<vecInt[i]<<ends;///стандартный вариант вывода } return 0; }
Работа программы:
First output: 0 1 2 3 4
Second output: 0 1 2 3 4
Third output: 0 1 2 3 4
В 7 строке мы объявили вектор vecInt
размером на 5 элементов типа int
. В 9 строке создаем указатель pointer
, указывающий на нулевой элемент вектора. С 10-13 строки производим заполнение вектора при помощи указателя pointer
. Вывод нашего вектора можно выполнить тремя различными способами. В строках с 16-19 выполняется первый вариант вывода. Этот вариант вывода равносилен выводу массива с использованием указателей, так, что нечего необычного и непонятного для Вас быть не должно.
Следующий вариант вывода описан в строках 23-27. Поскольку расположение элементов вектора в памяти производится последовательно один за другим, то в строке 25 указатель указывает на ячейку в памяти, где расположен i
-тый элемент вектора (вывод которого мы и осуществляем) . В 26 строке используя постфиксную форму, мы увеличиваем значение указателя на единицу, указатель указывает на следующий элемент вектора. Третий вывод самый обычный, описан с 31-34 строку, с ним тоже вопросов быть не должно.
В вектора можно вставлять элемент, как в начало вектора, так и в конец, при помощи функций vector::emplace()
и vector::emplace_back()
, рассмотрим пример:
#include <iostream> #include <vector> using namespace std; int main() { vector<int>vecInt; vector<int>::iterator it; for(int i=0;i<5;++i)///заполнение вектора значениями 0-4 { vecInt.push_back(i); } ///итератор указывает на нулевой элемент вектора it=vecInt.begin(); vecInt.emplace(it,10);///вставляем нулевым элементом число 10 в вектор it=vecInt.begin()+2;///итератор указывает на второй элемент вектора vecInt.emplace(it,10);///вставляем вторым элементом число 10 в вектор vecInt.emplace_back(10);///вставляем в конец вектора число 10 cout<<"Vector contains: "; for( it=vecInt.begin();it<vecInt.end();++it) { cout<<*it<<ends; } return 0; }
Работа программы:
Vector contains: 10 0 10 1 2 3 4 10
Работу программы в строках с 6-12, думаю, описывать не стоит. В 15 строке итератор it
указывает на начало нашего вектора, а в 17 строке при помощи функции vector::emplace()
и итератора it
, мы помещаем число 10 в начало вектора, т. е. vector::emplace()
принимает два аргумента, первый, это позиция куда будет помещен элемент (в нашем случае vecInt.begin()
или нулевой элемент вектора), второе, сам элемент (в нашем случае число 10).
В 19 строке итератор указывает на второй элемент в векторе vecInt[2]
. Назначение строки 21 равносильно строке 17. В 23 строке с помощью функции vector::emplace_back()
, мы помещаем число 10 в конец вектора. Эта запись равносильна vecInt.push_back(10).
В строках 26-29 производится вывод вектора на экран с помощью итератора it
.
Вектора имеют функцию, которая позволяет определить пустой ли вектор, позволяет удалить определенный элемент, получить доступ к нулевому и последнему элементу, пример:
#include <iostream> #include <vector> using namespace std; int main() { vector<int>vecIntFirst, vecIntSecond; for(int i=0;i<10;++i)///заполняем вектор vecIntSecond значениями 0-9 { vecIntSecond.push_back(i); } cout<<"vecIntSecond contains: "; for(int i=0;i<vecIntSecond.size();++i)///выводим заполненный вектор vecIntSecond { cout<<vecIntSecond[i]<<ends; } vecIntFirst.empty()?cout<<"\nvecIntFirst is empty\n":cout<<"vecIntFirst is not empty\n"; vecIntSecond.empty()?cout<<"vecIntSecond is empty\n":cout<<"vecIntSecond is not empty\n"; ///нумерация векторов идет от нулевого элемента vecIntSecond.erase(vecIntSecond.begin()+1);///стираем 1 элемент вектора vecIntSecond.erase(vecIntSecond.begin()+2,vecIntSecond.begin()+6);///стираем 3-6 элементы вектора, 7 элемент не стирается cout<<"vecIntSecond contains: "; for(int i=0;i<vecIntSecond.size();++i) { cout<<vecIntSecond[i]<<ends; } cout<<endl; cout<<"first element in vector: "<<vecIntSecond.front()<<endl;///выводим самый первый элемент в векторе cout<<"last element in vector: "<<vecIntSecond.back()<<endl;///выводим самый последний элемент в векторе cout<<"first-last: "<<vecIntSecond.front()-vecIntSecond.back()<<endl;///вычитаем из первого элемент вектора последний элемент вектора return 0; }
Работа программы :
vecIntSecond contains: 0 1 2 3 4 5 6 7 8 9
vecIntFirst is empty
vecIntSecond is not empty
vecIntSecond contains: 0 2 7 8 9
first element in vector: 0
last element in vector: 9
first-last: -9
Думаю до строки 19, объяснять работу программы не стоит. В 19 и 20 строке мы знакомимся с новым оператором vector::empty()
который возвращает значение true
если пустой вектор и false
если полон. В строках 19 и 20 используется тернарный оператор ( ? :
), который равносилен конструкции if() else()
. Строку 19 можно прочитать так: если vecIntFirst
пуст, то выведи сообщение, что он пуст, иначе выведи сообщение, что он не пуст. 20 строка равносильна 19 строке. В строке 23 с использованием функции vector:erase()
, мы стираем первый элемент вектора (не забывайте, что вектора как и массивы нумеруются с нулевого элемента).
Функции vector:erase()
мы указываем, что бы она удаляла элемент в позиции vecIntSecond.begin()
который у нас равен нулевому элементу, плюс один элемент. Иначе говоря 0+1=1 (удален первый элемент). В строке 24 я хотел показать, что можно удалять не только один элемент вектора, но так же и группу элементов. Тут функция vector:erase()
принимает два аргумента: первый – элемент, с которого начнется удаление (он будет удален) и второй – элемент по который будет производиться удаление, последний элемент (не будет удален).
Функции vector:erase()
можно задавать не только координаты начала вектора vecIntSecond.begin()
, но так же и координаты конца вектора vecIntSecond.end()
, тогда нумерация пойдет с конца. В строках 27-30 производится вывод на экран, а в строке 33 мы с помощью функции vector::front()
обращаемся к нулевому элементу вектора и выводим ее на экран. В 34 строке соответственно к последнему элементу вектора и тоже выводим ее на экран. В 35 строке мы вычитаем из первого элемента, последний элемент и выводим разницу.
Комментарии
Tom Eit
Помогите не работает emplace в вижуал студио скачаного с оф сайта недавно
Dinmukhammed Junisov
Вы написали
vector::emplace_back()
, мы помещаем число 10 в конец вектора. Эта запись равносильнаvecInt.push_back(10).
Но ведь vector::emplace_back() помещает в конец , а vecInt.push_back(10) в самую верх то есть в начало вектора, не так ли?
NaikoN
Вот пример :
NaikoN
Что-то выше не очень красиво вышло.
Пример:
Правильно ли я тебя понял, что при использовании
вывод должен был быть вида: 3012 ????