Класс insert_iterator
Описывает адаптер итератора, удовлетворяющий требованиям итератора вывода. Он вставляет элементы, а не перезаписывает их в последовательность. Таким образом он предоставляет семантику, которая отличается от семантики перезаписи, предоставляемой итераторами последовательности C++ и ассоциативными контейнерами. Класс insert_iterator
шаблонизируется в адаптируемом типе контейнера.
Синтаксис
template <class Container>
class insert_iterator;
Параметры
Контейнер
Тип контейнера, в который итератор insert_iterator
вставит элементы.
Замечания
Контейнер типа Container
должен соответствовать требованиям для контейнера с переменным размером и иметь функцию-член с двумя аргументами, в которой параметры имеют тип Container::iterator
и Container::value_type
которые возвращают тип Container::iterator
. Последовательности из стандартной библиотеки С++ и упорядоченные ассоциативные контейнеры удовлетворяют данным требованиям и могут быть адаптированы к использованию в сочетании с insert_iterator
s. Для ассоциативных контейнеров аргумент позиции обрабатывается как подсказка, которая потенциально может увеличить или снизить производительность в зависимости от эффективности подсказки. Итератор insert_iterator
всегда необходимо инициализировать с его контейнером.
Конструкторы
Конструктор | Description |
---|---|
insert_iterator | Создает итератор insert_iterator , добавляющий элемент в указанную позицию в контейнере. |
Определения типов
Введите имя | Description |
---|---|
container_type | Тип, представляющий контейнер, в который будет осуществляться вставка общего типа. |
reference | Тип, который предоставляет ссылку на элемент последовательности под управлением связанного контейнера. |
Операторы
Operator | Description |
---|---|
operator* | Оператор разыменования используется для реализации выражения итератора вывода * i = x для вставки общего типа. |
оператор++ | Увеличивает insert_iterator до следующего местоположения, в котором можно сохранить значение. |
operator= | Оператор присваивания, используемый для реализации выражения итератора вывода * i = x для вставки общего типа. |
Требования
Заголовок: <итератор>
Пространство имен: std
insert_iterator::container_type
Тип, представляющий контейнер, в который будет осуществляться вставка общего типа.
typedef Container container_type;
Замечания
Этот тип является синонимом для параметра-шаблона Container.
Пример
// insert_iterator_container_type.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
list<int> L1;
insert_iterator<list<int> >::container_type L2 = L1;
inserter ( L2, L2.end ( ) ) = 20;
inserter ( L2, L2.end ( ) ) = 10;
inserter ( L2, L2.begin ( ) ) = 40;
list <int>::iterator vIter;
cout << "The list L2 is: ( ";
for ( vIter = L2.begin ( ) ; vIter != L2.end ( ); vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
}
/* Output:
The list L2 is: ( 40 20 10 ).
*/
insert_iterator::insert_iterator
Создает итератор insert_iterator
, добавляющий элемент в указанную позицию в контейнере.
insert_iterator(Container& _Cont, typename Container::iterator _It);
Параметры
_Продолжение
Контейнер, в который insert_iterator
вставляет элементы.
_Оно
Позиция для вставки.
Замечания
Все контейнеры имеют функцию-член вставки, которая вызывается insert_iterator
. Для ассоциативных контейнеров параметр позиции — это просто предложение. Функция вставки предоставляет удобный способ вставки значений.
Пример
// insert_iterator_insert_iterator.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
int i;
list <int>::iterator L_Iter;
list<int> L;
for (i = 1 ; i < 4 ; ++i )
{
L.push_back ( 10 * i );
}
cout << "The list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++)
cout << *L_Iter << " ";
cout << ")." << endl;
// Using the member function to insert an element
inserter ( L, L.begin ( ) ) = 2;
// Alternatively, you may use the template version
insert_iterator< list < int> > Iter(L, L.end ( ) );
*Iter = 300;
cout << "After the insertions, the list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++ )
cout << *L_Iter << " ";
cout << ")." << endl;
}
/* Output:
The list L is:
( 10 20 30 ).
After the insertions, the list L is:
( 2 10 20 30 300 ).
*/
insert_iterator::operator*
Разыменовывает итератор вставки и возвращает адреса элемента.
insert_iterator<Container>& operator*();
Возвращаемое значение
Функция-член возвращает значение адресованного элемента.
Замечания
Используется для реализации выражения итератора выходных данных *Iter. = Если Iter
это итератор, который обращается к элементу в последовательности, то *Iter = заменяет этот элемент значением и не изменяет общее количество элементов в последовательности.
Пример
// insert_iterator_op_deref.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
int i;
list <int>::iterator L_Iter;
list<int> L;
for (i = 0 ; i < 4 ; ++i )
{
L.push_back ( 2 * i );
}
cout << "The original list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++ )
cout << *L_Iter << " ";
cout << ")." << endl;
insert_iterator< list < int> > Iter(L, L.begin ( ) );
*Iter = 10;
*Iter = 20;
*Iter = 30;
cout << "After the insertions, the list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++ )
cout << *L_Iter << " ";
cout << ")." << endl;
}
/* Output:
The original list L is:
( 0 2 4 6 ).
After the insertions, the list L is:
( 10 20 30 0 2 4 6 ).
*/
insert_iterator::operator++
Увеличивает insert_iterator
до следующего местоположения, в котором можно сохранить значение.
insert_iterator<Container>& operator++();
insert_iterator<Container> operator++(int);
Параметры
insert_iterator
, адресующий следующее местоположение, в котором можно сохранить значение.
Замечания
Операторы preincrementation и postincrementation возвращают одинаковый результат.
Пример
// insert_iterator_op_incr.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
int i;
vector<int> vec;
for (i = 1 ; i < 5 ; ++i )
{
vec.push_back ( i );
}
vector <int>::iterator vIter;
cout << "The vector vec is:\n ( ";
for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
insert_iterator<vector<int> > ii ( vec, vec.begin ( ) );
*ii = 30;
ii++;
*ii = 40;
ii++;
*ii = 50;
cout << "After the insertions, the vector vec becomes:\n ( ";
for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++ )
cout << *vIter << " ";
cout << ")." << endl;
}
/* Output:
The vector vec is:
( 1 2 3 4 ).
After the insertions, the vector vec becomes:
( 30 40 50 1 2 3 4 ).
*/
insert_iterator::operator=
Вставляет значение в контейнер и возвращает итератор, который обновлен и указывает на новый элемент.
insert_iterator<Container>& operator=(
typename Container::const_reference val,);
insert_iterator<Container>& operator=(
typename Container::value_type&& val);
Параметры
Val
Значение, которое должно быть присвоено контейнеру.
Возвращаемое значение
Ссылка на элемент, вставленный в контейнер.
Замечания
Первый оператор-член вычисляет
Iter = container->insert(Iter, val)
;
++Iter;
затем возвращает *this
.
Второй оператор-член вычисляет
Iter = container->insert(Iter, std::move(val));
++Iter;
затем возвращает *this
.
Пример
// insert_iterator_op_assign.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
int i;
list <int>::iterator L_Iter;
list<int> L;
for (i = 0 ; i < 4 ; ++i )
{
L.push_back ( 2 * i );
}
cout << "The original list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++ )
cout << *L_Iter << " ";
cout << ")." << endl;
insert_iterator< list < int> > Iter(L, L.begin ( ) );
*Iter = 10;
*Iter = 20;
*Iter = 30;
cout << "After the insertions, the list L is:\n ( ";
for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++ )
cout << *L_Iter << " ";
cout << ")." << endl;
}
/* Output:
The original list L is:
( 0 2 4 6 ).
After the insertions, the list L is:
( 10 20 30 0 2 4 6 ).
*/
insert_iterator::reference
Тип, который предоставляет ссылку на элемент последовательности под управлением связанного контейнера.
typedef typename Container::reference reference;
Замечания
Тип, который описывает ссылку на элемент последовательности под управлением связанного контейнера.
Пример
// insert_iterator_container_reference.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
list<int> L;
insert_iterator<list<int> > iivIter( L , L.begin ( ) );
*iivIter = 10;
*iivIter = 20;
*iivIter = 30;
list<int>::iterator LIter;
cout << "The list L is: ( ";
for ( LIter = L.begin ( ) ; LIter != L.end ( ); LIter++ )
cout << *LIter << " ";
cout << ")." << endl;
insert_iterator<list<int> >::reference
RefFirst = *(L.begin ( ));
cout << "The first element in the list L is: "
<< RefFirst << "." << endl;
}
/* Output:
The list L is: ( 10 20 30 ).
The first element in the list L is: 10.
*/
См. также
<iterator>
Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++