此文只做简单介绍(摘自c++标准函数库)
insert iterator(安插性迭代器)
可解决算法的“空间不足”问题,它会促使目标区间的大小按需增长。
insert iterator内部将接口做了新的定义:
- 如果你对某个元素设值(assign),会引发“对其所属群集的安插(insert)操作”。至于插入位置是容器的最前或最后,或是某特定位置,视情况而定。
- “单步前进(step forward)”不会造成任何动静(是一个no-op)。
例子
//安插性迭代器 insert iterator
#include<iostream>
#include<vector>
#include<list>
#include<deque>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
int main() {
list<int> coll1;
//insert elements from 1 to 9 into the first collection
for (int i = 1; i <= 9; ++i) {
coll1.push_back(i);
}
//copy the elements of coll1 into coll2 by appending them
vector<int> coll2;
copy(coll1.begin(), coll1.end(),//source
back_inserter(coll2));//destination
//copy the elements of coll1 onto coll3 by inserting them at the front-reverses the order of the elements
deque<int> coll3;
copy(coll1.begin(), coll1.end(),//source
front_inserter(coll3));//destination
//copy elements of coll1 into coll4 only inserter that works for associative collections
set<int> coll4;
copy(coll1.begin(), coll1.end(),//source
inserter(coll4, coll4.begin()));//destination
system("pause");
return 0;
}
此例运用了三个预先定义的insert iterator:
1,Back inserters(安插于容器最尾端)
Back inserter的内部调用push_back(),在容器尾端插入元素(此即“追加”动作)。只有提供push_back()成员函数的容器中,Back inserters才能派上用场。在c++标准中,这种容器有三种vector,list,deque。
2,Front inserters(安插于容器最前端)
Front inserter的内部调用push_front()成员方法,将元素安插于容器最前端。这种操作逆转了被安插元素的顺序。如果先安插1,再向前安插2,那么1会排列在2的后面。只有提供push_front()成员方法的容器才能使用Front inserters,在c++标准库中这样的容器有list,deque
3,General inserters(一般性安插器)
它的作用是将元素插入“初始化时接受的第二个参数”所指位置的其前方。inserters内部调用成员函数insert(),并以新值和新位置为参数。
注意:不是在关联式容器身上安插元素时,不能指定其位置吗?它们的位置是有它们的值决定的吗?解释:在关联式容器中,你所给的位置只是一个提示,帮助它确定从什么位置开始搜索正确的安插位置,如果提示不正确,效率上的表现会比“没有提示”更糟糕。
预定义的三种inserter iterator
back_inserters(container)
front_inserter(container)
inserter(container,pos)在pos位置插入元素
Stream iterator(流迭代器)
这是一种用来读写stream的迭代器。他们提供了必要的抽象性,使得来自键盘的输入像是个群集(collection),你能够从中读取内容,同样道理,你也可以把一个算法的输出结果重新导向到某个文件或屏幕上。
简单例子
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<iterator>
using namespace std;
int main() {
vector<string> coll;
/*
read all words from the standard input
-source: all strings until end-of-file (or error)
-destination: coll (inserting)
使用ctrl-z结束
*/
copy(istream_iterator<string>(cin),//start of source
istream_iterator<string>(),// end of source
back_inserter(coll));//destination
// sort elements
sort(coll.begin(), coll.end());
/*
print all elements without duplicates
-source: coll
-destination: standard output (with newline between element)
*/
unique_copy(coll.begin(),coll.end(),//source
ostream_iterator<string>(cout,"\n"));//destination,输出每个对象后都输出回车换行
return 0;
}
这个程序只有三条语句就完成了一系列工作:从标准输入读取所有输入文字,排序,将他们打印到屏幕。
分析
copy(istream_iterator<string>(cin),//start of source
istream_iterator<string>(),// end of source
back_inserter(coll));//destination
1,istream_iterator<string>(cin):产生一个可从“标准输入流(standard input stream)cin”读取数据的stream Iterator。跟调用cin>>string差不多,逐词读取,空格不读取。
2,istream_iterator():调用istream iterators的default构造函数,产生一个代表“流结束符号”(end-of-stream)的迭代器。
3,back_inserter(coll):不断地利用back_iterator将所读的数据放入coll容器中。
sort(coll.begin(), coll.end());
将读取的元素进行排序
unique_copy(coll.begin(),coll.end(),//source
ostream_iterator<string>(cout,"\n"));
将其中所有元素拷贝到目的端cout。处理过程中的算法unique_copy()会消除毗邻的重复值。其中表达式ostream_iterator<string>(cout,"\n")会产生一个output stream iterator,透过operator<<向cout写入strings。cout之后的第二个参数可有可无,它被用来作为元素之间的分隔符。本例每个子串一个单独的行。
reverse iterators(逆向迭代器)
它将递增(increment)运算转换为递减(decrement)运算。所有容器都可透过成员函数rbegin()和rend()产生出reverse iterator.
例子
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main() {
vector<int> coll;
for (int i = 1; i <= 9; ++i) {
coll.push_back(i);
}
copy(coll.rbegin(), coll.rend(),
ostream_iterator<int>(cout," "));
cout << endl;
return 0;
}
输出为9 8 7 6 5 4 3 2 1 比较好理解