c++STL的三种迭代器配接器[insert iterator(安插性迭代器),Stream iterator(流迭代器),reverse iterators(逆向迭代器)]

此文只做简单介绍(摘自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 比较好理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值