В вектор можно добавлять элементы с помощью указателей, для этого используется функция 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
Вот пример :
#include <vector> #include <iostream> using namespace std; int main() { vector <int> myvec; for(int i = 0; i < 3; ++i) { myvec.push_back(i); } for(int i = 0; i < 3; ++i) { cout << myvec[i] << ends; } myvec.push_back(3); cout << endl; for(int i = 0; i < 4; ++i) { cout << myvec[i] << ends; } return 0; } Вывод: #include <vector> #include <iostream> using namespace std; int main() { vector <int> myvec; for(int i = 0; i < 3; ++i) { myvec.push_back(i); } for(int i = 0; i < 3; ++i) { cout << myvec[i] << ends; } myvec.push_back(3); cout << endl; for(int i = 0; i < 4; ++i) { cout << myvec[i] << ends; } return 0; } Вывод: 012 0123 Правильно ли я тебя понял, что при использовании myvec.push_back(3); вывод должен был быть вида: 3012 ????NaikoN
Что-то выше не очень красиво вышло.
Пример:
#include <vector> #include <iostream> using namespace std; int main() { vector <int> myvec; for(int i = 0; i < 3; ++i) { myvec.push_back(i); } for(int i = 0; i < 3; ++i) { cout << myvec[i] << ends; } myvec.push_back(3); cout << endl; for(int i = 0; i < 4; ++i) { cout << myvec[i] << ends; } return 0; }Правильно ли я тебя понял, что при использованиивывод должен был быть вида: 3012 ????