SGI

insert_iterator<Container>

类别:迭代器,适配器 组件类型:类型

描述

插入迭代器是一个迭代器适配器,充当输出迭代器:通过insert_iterator进行赋值会将一个对象插入到容器中。具体来说,如果ii是一个insert_iterator,那么ii会跟踪一个容器c和一个插入点p;表达式*ii = x执行插入操作c.insert(p, x). [1]

有两个不同的容器概念定义了此表达式:序列排序关联容器。这两个概念都通过c.insert(p, x)定义了容器的插入操作,但此表达式的语义在这两种情况下却大不相同。

对于序列S,表达式S.insert(p, x)表示插入值x 迭代器p之前。也就是说,insert的双参数版本允许你控制新元素插入的位置。但是,对于排序关联容器,则无法进行此类控制:排序关联容器中的元素始终按键的升序排列。排序关联容器定义了insert的双参数版本作为一种优化。第一个参数只是一个提示:它指向搜索将开始的位置。

如果你多次通过insert_iterator进行赋值,那么你将向底层容器插入多个元素。对于序列,它们将按插入顺序出现在底层序列中的特定位置:insert_iterator的构造函数的参数之一是一个迭代器p,并且新范围将插入到p.

之前。对于排序关联容器insert_iterator的构造函数中的迭代器几乎无关紧要。新元素不一定形成连续的范围;它们将按键的升序出现在容器中的适当位置。插入它们的顺序只会影响效率:将已排序的范围插入到排序关联容器中是一个O(N)操作。

示例

将一系列元素插入到列表.
list<int> L;
L.push_front(3);
insert_iterator<list<int> > ii(L, L.begin());
*ii++ = 0;
*ii++ = 1;
*ii++ = 2;
copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
// The values that are printed are 0 1 2 3.
中合并两个已排序的列表,并将结果范围插入到集合中。请注意,集合从不包含重复元素。
int main() 
{
  const int N = 6;

  int A1[N] = {1, 3, 5, 7, 9, 11};
  int A2[N] = {1, 2, 3, 4, 5, 6};
  set<int> result;

  merge(A1, A1 + N, A2, A2 + N, 
        inserter(result, result.begin()));
 
  copy(result.begin(), result.end(), ostream_iterator<int>(cout, " "));
  cout << endl;

  // The output is "1 2 3 4 5 6 7 9 11".
}

定义

在标准头文件iterator中定义,并在非标准向后兼容头文件iterator.h中定义。

模板参数

参数 描述 默认值
Container 将插入值的容器类型。  

模型

输出迭代器。插入迭代器的值类型集(如输出迭代器要求中所定义)包含单个类型Container::value_type.

类型要求

公共基类

无。

成员

成员 定义位置 描述
insert_iterator(Container&, Container::iterator) insert_iterator 见下文。
insert_iterator(const insert_iterator&) 平凡迭代器 复制构造函数
insert_iterator& operator=(const insert_iterator&) 平凡迭代器 赋值运算符
insert_iterator& operator*() 输出迭代器 用于实现输出迭代器表达式*i = x. [2]
insert_iterator& operator=(const Container::value_type&) 输出迭代器 用于实现输出迭代器表达式*i = x. [2]
insert_iterator& operator++() 输出迭代器 前置递增。
insert_iterator& operator++(int) 输出迭代器 后置递增。
output_iterator_tag iterator_category(const insert_iterator&) 迭代器标记 返回迭代器的类别。这是一个全局函数,而不是成员函数。
template<class Container, class Iter)
insert_iterator<Container>
inserter(Container& C, Iter i);
insert_iterator 见下文。

新成员

这些成员未在输出迭代器要求中定义,而是特定于insert_iterator.
成员 描述
insert_iterator(Container& C, Container::iterator i) 构造一个insert_iterator,它在C中插入对象。如果Container序列,则每个对象都将插入到迭代器i中插入对象。如果C所指向的元素之前。如果i作为搜索开始的提示。迭代器i必须是C.
template<class Container, class Iter)
insert_iterator<Container>
inserter(Container& C, Iter i);
中的可解引用或末尾迭代器。等价于[2]这是一个全局函数,而不是成员函数。

注释

[1] 请注意通过Container::iterator进行赋值与通过insert_iterator<Container>中插入对象。如果i进行赋值之间的区别。如果Sequence::iterator是一个有效的*i = tt替换该元素,并且不会更改容器中元素的总数。如果ii进行赋值之间的区别。如果insert_iterator<container>,则表达式*ii = t等价于(对于某些container c和某些有效的container::iterator j),表达式c.insert(j, t)。也就是说,它不会覆盖任何c的元素,并且会更改c的大小。

[2] 请注意如何实现通过insert_iterator进行赋值。通常,一元operator*必须定义为返回一个代理对象,其中代理对象定义operator=以执行插入操作。在本例中,为了简单起见,代理对象是insert_iterator本身。也就是说,*i仅返回i,并且*i = t等价于i = t。但是,你不应依赖此行为。这是一个实现细节,并且不保证在将来的版本中保持不变。

[3] 此函数仅出于方便的目的而存在:因为它是非成员函数,因此可以推断模板参数,并且不必显式声明insert_iterator的类型。例如,反转一个范围并将其插入到序列中的一种简单方法是S,例如,是reverse_copy(first, last, inserter(S, S.begin())).

另请参阅

front_insert_iteratorback_insert_iterator输出迭代器序列迭代器概述
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息