STL迭代器值迭代器绑定器:Insert Iterators

本文介绍了C++标准库中插入迭代器的基本概念及其三种类型:BackInserters、FrontInserters和GeneralInserters。通过实例展示了如何使用这些迭代器来改变容器元素的插入方式,并对比了它们之间的区别。
Insert iterators是这样一个迭代器:从赋一个新值转变为插入一个新值。通过使用Insert iterators,算法能插入而不是重写。所有的Insert iterators都是output iterator categor。它们只提供赋一个新的能力。
看Copy的实现:
namespace std {
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator from_pos,  InputIterator from_end, OutputIterator to_pos) 
{
while (from_pos != from_end) {
*to_pos = *from_pos; //copy values
++from_pos; //increment iterators
++to_pos;
}
return to_pos;
}}
insert iterator从赋值转为插入,这实际上有两个操作包含在内:第一,operator *返回iterator的实际的元素,第二,operator =赋一个新值。insert iterator的执行有以下两步戏法:
step1: Operator *就是简单的返回*this,因此对于insert iterator*pos等价于pos.
step2:为了转换为插入操作赋值操作被执行。实际上赋值操作调用push_back(), push_front(), or insert(),它们是容器的成员函数。对于insert iterator你可以写pos=value 来代替 *pos=value 来插入一个元素。
插入迭代器的种类:
Name         Class              Called Function       Creation
Back inserter   back_insert_iterator   push_back (value)    back_inserter (cont)
Front inserter   front_insert_iterator   push_front (value)   front_inserter (cont)
General inserter insert_iterator        insert (pos, value)    inserter (cont, pos)

Back Inserters
A back inserter在追加一个元素通过调用容器的 push_back(). push_back()只在vectors, deques, lists, and strings有,所以只有这几个容器可以用Back InsertersA back inserter一定在创建时用一个容器初始化。back_inserter()提供了一个函数做这个。
例子:
vector<int> coll;
back_insert_iterator<vector<int> > iter(coll);
*iter = 1;iter++;*iter = 2;iter++;*iter = 3;
PRINT_ELEMENTS(coll);
back_inserter(coll) = 44;
back_inserter(coll) = 55;
PRINT_ELEMENTS(coll);
copy (coll .begin(), coll.end(), //source
back_inserter(coll));        //destination
PRINT_ELEMENTS(coll);
Output:
1 2 3
1 2 3 44 55
1 2 3 44 55 1 2 3 44 55

Front Inserters
Front InsertersBack Inserters的区别在于:它调用的是容器的push_front()。所以只能对list,deque适用。front_inserter()函数可以提供像back_inserter()的功能。其它的和Back Inserters一样。

General Inserters
General Inserters的初始化需要两个参数,一个是容器,一个位置。它对所有的容器都适用,但对于关联容器,它的位置不是我们能控制的,所以它只是一个hint.
set<int> coll;
insert_iterator<set<int> > iter(coll,coll.begin());
*iter = 1;iter++;*iter = 2;iter++;*iter = 3;
PRINT.ELEMENTS(coll,"set: ");
inserter(coll,coll.end()) = 44;
inserter(coll,coll.end()) = 55;
PRINT_ELEMENTS(coll,"set: ");
list<int> coll2;
copy (coll.begin(), coll.end(),inserter(coll2,coll2.begin()));
PRINT_ELEMENTS(coll2,"list: ");
copy (coll.begin(), coll.end(),inserter(coll2,++coll2.begin()));
PRINT_ELEMENTS(coll2,"list: ");
}
Output:
set: 1 2 3
set: 1 2 3 44 55
list: 1 2 3 44 55
list: 1 1 2 3 44 55 2 3 44 55
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值