类别:迭代器,适配器 | 组件类型:类型 |
有两个不同的容器概念定义了此表达式:序列和排序关联容器。这两个概念都通过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". }
参数 | 描述 | 默认值 |
---|---|---|
Container | 将插入值的容器类型。 |
成员 | 定义位置 | 描述 |
---|---|---|
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(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 = t用t替换该元素,并且不会更改容器中元素的总数。如果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())).