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

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 Inserters A 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 Inserters Back 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、付费专栏及课程。

余额充值