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
本文介绍了C++标准库中插入迭代器的基本概念及其三种类型:BackInserters、FrontInserters和GeneralInserters。通过实例展示了如何使用这些迭代器来改变容器元素的插入方式,并对比了它们之间的区别。
88

被折叠的 条评论
为什么被折叠?



