Втавка и удаление элементов

Операция Назначение
v.insert(pos,elem) Вставляет в позицию pos элемент elem, возвращает позицию следующего элемента
v.insert(pos,n,elem) Вставляет n элементов elem в позицию pos
v.insert(pos,beg,end) Вставляет элементы интервала [beg, end) в позицию pos
v.insert(pos,initlist) Вставляет копии всех элементов списка инициа-лизации initlist перед позицией итератора pos и возвращает позицию первого нового элемента (или итератор pos, если новых элементов нет) (стандарт С++ 11)
v.emplace(pos,args) Вставляет новый элемент, инициализированный спис-ком аргументов args перед позицией итератора pos, и возвращает позицию нового элемента (стандарт С++ 11)
v.emplace_back(pos,args) Добавляет в конец вектора новый элемент, инициа-лизированный списком аргументов args (не возвращает ничего) (стандарт С++ 11)
v.push_back(elem) Вставляет элемент elem в конец вектора
v.pop_back() Удаляет последний элемент
v.erase(pos) Удаляет элемент в позиции pos и возвращает позицию следующего элемента
v.erase(beg,end) Удаляет все элементы из интервала [beg, end)
v. resize(num) Приводит контейнер к размеру num
v. resize(num, elem) Приводит контейнер к размеру num, новые элементы создаются как копии elem
v. clear () Удаляет содержимое вектора

 

Рассмотрим пример программы, демонстрирующей методы класса vector<>.

//Листинг 25.3

#include<iostream>

#include<vector>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"Russian");

int m[] = {1,5,3,4,0,2,1,4,8,3};

vector <int> v1; //конструктор по умолчанию

//вектор из 20 пустых значений

vector <int> v2(20);

vector <int> v3(10,1);//вектор из 10 единиц

vector <int> v4(v3); //копия вектора v3

//вектор из 10 элементов массива m

vector <int> v5(m, m+10);

cout<<"size v5 = "<<v5.size()<<endl;

cout<<"empty v5 = "<<v5.empty()<<endl;

cout<<"max_size v5 = "

<<v5.max_size()<<endl;

cout<<"capacity v5 = "

<<v5.capacity()<<endl;

v5.reserve(20);

cout<<"capacity v5 = "

<<v5.capacity()<<endl;

 

//операции сравнения

if (v3 == v4) cout<<"v3 is equal v4\n";

// Вектор из 3-х элементов массива m

vector<int> v6(m, m+3);

if (v6<v5) cout<<"v6 < v5\n";

 

//операции присваивания

v1= v6;

//вывод вектора на экран

//с помощью операции индексирования

for (int i = 0; i<v1.size(); i++)

cout<<v1[i]<<" ";

cout<<endl;

v2.assign(100,0);

cout<<"size v2 = "<<v2.size()<<endl;

cout<<"capacity v2 = "<<v2.capacity()

<<endl;

v6.swap(v5);

cout<<"size v6 = "<<v6.size()<<endl;

cout<<"size v5 = "<<v5.size()<<endl;

 

//вывод вектора на экран с помощью итератора

vector<int>:: iterator it;

for(it=v5.begin();it<v5.end();it++)

cout<<*it<<'\t';

cout<<endl;

 

vector <int> v;

// Заполнение вектора

for(int i = 0; i < 10; i++) v.push_back(i);

while(!v.empty()) // Пока вектор не пустой

{ // Вывод на консоль последнего элемента

cout<<v.back()<<' ';

//Удаление последнего элемента

v.pop_back();

}

cout<<endl;

vector <int> q(5,2);// Вектор из пяти двоек

// Вставить первые 5 нулей

q.insert(q.begin(),5,0);

// Вставить следующие 5 единиц

q.insert(q.begin()+5,5,1);

for(int i=0;i<15;i++)

cout<<q[i]<<' ';

cout<<endl;

// Удалить 5 единиц

q.erase(q.begin()+5,q.begin()+10);

for(int i=0;i<10;i++)

cout<<q[i]<<' ';

cout<<endl;

q.resize(5);// Изменить размер вектора до 5

cout<<"size q = "<<q.size()<<endl;

q.clear(); // Очистить содержимое

cout<<"empty q = "<<q.empty()<<endl;

return 0;

}

Результаты выполнения программы:

size v5 = 10

empty v5 = 0

max_size v5 = 1073741823

capacity v5 = 10

capacity v5 = 20

v3 is equal v4

v6 < v5

1 5 3

size v2 = 100

capacity v2 = 100

size v6 = 10

size v5 = 3

1 5 3

9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 1 1 1 1 1 2 2 2 2 2

0 0 0 0 0 2 2 2 2 2

size q = 5

empty q = 1

 

В операторе присваивания v1=v6, несмотря на то, что переменной v1 изначально не было выделено памяти для хранения данных, контейнер сам выделил необходимую память, куда и скопировал содержимое переменной v6, метод assign() также выделил необходимую память для вектора v2, метод swap () обменял не только данные двух векторов, но и их размеры.

Конструкция vector<int>:: iterator it обеспечивает описание итератора it для вектора с данными типа int, и в ней потребовалось явно указать имя контейнера с уточнением типа данных. Доступ же к данным возможен применением обычной операции разадресации итератора it. Далее, установив итератор на начало вектора, it= v5.begin(), передвигаемся по вектору, наращивая итератор it++, до достижения конца вектора it < v5.end(). *it — это значение элемента вектора (операция разадресации для итератора перегружена и имеет тот же смысл, что и для указателя).

При работе с контейнерами STL нужно иметь в виду, что при совершении операций вставки элемента или увеличения размера контейнера может автоматически происходить перераспределение памяти, т. е. для данных выделяется новая область памяти, куда они и копируются, а "старая" область памяти освобождается. Это приводит к тому, что после таких операций необходимо заново определять итераторы начала и конца контейнера.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: