insert_iterator 类

描述满足输出迭代器需求的迭代器适配器。 它将元素插入到序列而非覆盖序列。 因此,它提供的语义不同于 C++ 序列和关联容器的迭代器所提供的覆盖语义。 insert_iterator 类会针对要适配的容器类型进行模板化。

语法

template <class Container>
class insert_iterator;

参数

容器
要通过 insert_iterator 将元素插入其中的容器类型。

备注

Container 类型的容器必须满足可变大小容器的需求,并具有一个双自变量插入成员函数,其中参数分别为 Container::iteratorContainer::value_type 类型,将返回 Container::iterator 类型。 C++ 标准库序列和排序关联容器符合这些需求,可以进行适配以便用于 insert_iterator。 对于关联容器,位置自变量将被当做提示来处理,有可能会提高或降低性能,具体取决于该提示的好坏。 insert_iterator 必须使用其容器进行初始化。

构造函数

构造函数 说明
insert_iterator 构造一个 insert_iterator,以便将元素插入到容器中的指定位置。

Typedef

类型名称 说明
container_type 一种类型,代表要对其执行泛型插入的容器。
reference 一种类型,此类型提供对关联容器所控制序列中的元素的引用。

运算符

运算符 说明
operator* 取消引用运算符,用于实现泛型插入的输出迭代器表达式 * i = x
operator++ insert_iterator 递增到下一个可用来存储值的位置。
operator= 赋值运算符,用于实现泛型插入的输出迭代器表达式 * i = x

要求

标头:<iterator>

命名空间: 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);

参数

_Cont
insert_iterator 要将元素插入到其中的容器。

_It
插入位置。

注解

所有容器都具有由 insert_iterator 调用 insert 成员函数。 对于关联容器,位置参数仅是一项建议。 inserter 函数提供了方便插入值的方式。

示例

// 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 = value。 如果 Iter 是对序列中的元素进行寻址的迭代器,则 *Iter = value 会替换该元素的值,且不会改变此序列中元素的总数。

示例

// 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,它寻址下一个可用来存储值的位置。

注解

前递增和后递增运算符将返回相同的结果。

示例

// 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++ 标准库参考