Записки программиста
Авторский блог Михаила Лукина

vector::insert



iterator insert ( iterator position, const T& x );

void insert ( iterator position, size_type n, const T& x );

template <class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last );

Вставляет в вектор элементы перед элементом, на который указывает position.

Увеличивает размер вектора. Если новый размер вектора превышает объем выделенной памяти, происходит автоматическое перераспределение памяти. После перераспределения памяти становятся недействительными все итераторы, ссылки и указатели на элементы вектора.

Так как вектора имеют структуру массива, каждая вставка передвигает в памяти все элементы, идущие после вставленных (то есть, элементы из последовательности [position, vector::end)). Поэтому, вставка элементов в вектор более затратна, чем в другие последовательные контейнеры (dequeue, list).

 

Параметры

position
Итератор на элемент вектора, перед которым будут вставлены новые элементы.
x
Значение, копия которого вставляется в вектор.
n
Сколько раз скопировать элемент x в вектор. size_type - целый беззнаковый тип.
first
Итератор на первый элемент последовательности, содержимое которой вставляется в вектор.
last
Итератор на следующий за последним элемент последовательности, содержимое которой вставляется в вектор. Элемент, на который указывает last, не добавляется в вектор.

 

Возвращаемое значение

Только версия iterator insert ( iterator position, const T& x ); возвращает значение: итератор, указывающий на вставленный элемент.

 

Пример.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void PrintElem(int elem)
{
    cout << elem << " ";
}

int main ()
{
    vector<int> theVector (3, 100);

    cout << "theVector:" << endl;
    for_each(theVector.begin(), theVector.end(), PrintElem);
    cout << endl;

    vector<int>::iterator iter;

    iter = theVector.begin();
    iter = theVector.insert (iter, 200 );

    cout << "After inserting an element:" << endl;
    for_each(theVector.begin(), theVector.end(), PrintElem);
    cout << endl;

    theVector.insert (iter, 2, 300);

    cout << "After inserting repeating element:" << endl;
    for_each(theVector.begin(), theVector.end(), PrintElem);
    cout << endl;

    //iter больше недействетелен. Получаем его снова. 
    iter = theVector.begin();

    vector<int> insertingVector (2,400);
    theVector.insert (iter+4,insertingVector.begin(),insertingVector.end());

    cout << "After inserting a vector:" << endl;
    for_each(theVector.begin(), theVector.end(), PrintElem);
    cout << endl;

    int myArray [] = {501, 502, 503};
    theVector.insert (theVector.begin()+2, myArray, myArray+3); //Указатель является итератором произвольного доступа.

    cout << "After inserting an array:" << endl;
    for_each(theVector.begin(), theVector.end(), PrintElem);
    cout << endl;

    return 0;
}
 
 


Результат:

theVector:
100 100 100
After inserting an element:
200 100 100 100
After inserting repeating element:
300 300 200 100 100 100
After inserting a vector:
300 300 200 100 400 400 100 100
After inserting an array:
300 300 501 502 503 200 100 400 400 100 100

 

Временная сложность

O(n), где n - число вставляемых элементов.

 

Версия для печати

© 2010-2014. Записки программиста. Все права защищены.
Яндекс.Метрика
ВебСтолица.РУ: создай свой бесплатный сайт!  | Пожаловаться  
Движок: Amiro CMS