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
看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
step1: Operator *
step2:
插入迭代器的种类:
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)
A 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(),
back_inserter(coll));
PRINT_ELEMENTS(coll);
Output:
1 2 3
1 2 3 44 55
1 2 3 44 55 1 2 3 44 55
Front Inserters
General Inserters
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