#include
#include
using namespace std;
void DisplayVector(const vector& veclnput)
{
for (auto iElement = veclnput.cbegin() // auto и cbegin(): C++11
; iElement != veclnput.cend() // cend() только C++11
; ++ iElement )
9: cout « *iElement « '
1 0 :
cout « endl;
12: }
int main ()
{
// Создать экземпляр вектора с 4 элементами,
инициализированными значением 90
vector veclntegers (4, 90);
18:
cout « "The initial contents of the vector: ";
DisplayVector(veclntegers);
2 1 :
// Вставить 25 в начало
veclntegers.insert (veclntegers.begin (), 25);
// Вставить в конец 2 числа со значением 45
veclntegers.insert (veclntegers.end (), 2, 45);
cout « "Vector after inserting elements at beginning and end: ";
DisplayVector(veclntegers);
// Другой вектор, содержащий два элемента со значением 30
vector vecAnother (2, 30);
33:
// Вставить два элемента из другого контейнера в позицию [1]
veclntegers.insert (veclntegers.begin () +1,
vecAnother.begin (), vecAnother.end ());
37:
cout « "Vector after inserting contents from another vector: ";
cout « "in the middle:" « endl;
DisplayVector(veclntegers);
41:
return 0;
}
Типичные операции с вектором
|
411
|
Результат
The initial contents of the vector: 90 90 90 90
Vector after inserting elements at beginning and end: 25 90 90 90 90 45 45
Vector after inserting contents from another vector: in the middle:
25 30 30 90 90 90 90 45 45
Анализ
Этот код демонстрирует мощь функции i n s e r t (), позволяющей помещать значения в середину контейнера. Вектор в строке 17 содержит четыре элемента, которые инициали зированы значением 90. Взяв этот вектор за отправную точку, используем различные пере груженные версии функции-члена v e c t o r :: i n s e r t (). В строке 23 один элемент добавля ется в начало. В строке 26 используется перегруженная версия, добавляющая в конец два элемента со значением 45. Строка 35 демонстрирует возможность вставки элементов из одного вектора в середину другого (в этом примере во вторую позицию со смещением 1).
Хотя метод v e c t o r :: i n s e r t () весьма универсален, для добавления элементов в век тор предпочтительней использовать метод p u sh _ b a c k ().
Обратите внимание, что метод i n s e r t () — неэффективный способ добавления элементов
вектор (при добавлении в позицию, отличную от конца последовательности), поскольку до бавление элементов в начало или середину вектора сдвигает все последующие элементы назад (после создания места для последних в конце). Таким образом, в зависимости от типа объек тов, содержавшихся в последовательности, продолжительность этой операции сдвига может оказаться существенной с точки зрения вызова конструктора копий или оператора присвое ния копии. В данном примере вектор содержит объекты типа i n t , перемещение которых осу ществляется относительно быстро. Однако в других случаях все могло бы быть вовсе не так.
Если у вашего контейнера должны быть очень частые вставки в середину, име ет смысл использовать класс s td : : l i s t , рассматриваемый на занятии 18, "Классы двухсвязного и односвязного списков библиотеки STL”.
ВНИМАНИЕ! Используете ли вы устаревший компилятор C++?
Функция DisplayVector () в листинге 17.3 использует ключевое слово C++И auto для определения типа итератора в строке 6. В этом примере и далее для компиляции с использованием компилятора, не совместимого со стандартом С++11, необходимо заменить ключевое слово auto явным типом,
данном случае типом vector:: const_iterator.
Так, функция DisplayVector () для устаревшего компилятора должна быть изменена следующим образом:
Do'stlaringiz bilan baham: |