C++中的迭代器和迭代器的辅助函数

一、迭代器的基本概念

1、迭代器不仅仅是指针 可以指向容器中的一个位置,通过迭代器访问这个位置的元素,而不必关心这个位置对应的是真正的物理地址

 2、迭代器是算法和容器的“中间人”

 3、迭代器对存储在容器中的元素序列进行遍历,提供的访问容器中每个元素的方法

 4、指针式迭代器中的一种

 5、迭代器是泛化的指针,提供了类似指针的操作(诸如++、*、->运算符)

 6、两个迭代器表示一个区间:  [p1,p2) 左闭右开,stl算法常以迭代器的区间作为输入,传奇输入数据

二、迭代器的分类:

 输入迭代器:可以用来从序列中读取数据  p1 == p2; p1 != p2; *p1; p1->m; *p1++

输出迭代器:允许向序列中写入数据  *p1 = t; *p1++ = t;   p1++的返回值不确定

前向迭代器:即是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历  *p1; p1++

双向迭代器:与前向迭代器相似,但是在两个方向上都可以对数据遍历  --p1; p1--

随机访问迭代器:也是双向迭代器,但是能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器  p1 += n; p1 -= n; p1 - p2; p1 比较运算符 p2; p1[n]

例:自定义函数对象:

#include <stdlib.h>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
using namespace std;

template<class T>
class square
{
public:
	T operator()(T &t)
	{
		return t*t;
	}
};

int myfunc(int a)
{
	return a + 10;
}
int main()
{
	const int N = 5;
	vector<int> s(N);
	for (int i = 0; i < N; i++)
	{
		cin >> s[i];
	}
	transform(s.begin(), s.end(), ostream_iterator<int>(cout, " "), negate<int>());//negate<int>():取反
	//s.begin(), s.end():来源 输入、ostream_iterator<int>(cout, " "):输出、negate<int>():处理方式(普通函数不要加 (),而函数对象要加 () )
	//begin()来源的第一个元素,end():来源的最后徐一个元素的下一个 在双向迭代器中rbegin()是最后一个 rend()是第一个的前一个
	//transform(s.begin(), s.end(), ostream_iterator<int>(cout, " "), myfunc);
	//transform(s.begin(), s.end(), ostream_iterator<int>(cout, " "), square<int>());
	cout << endl;
	
	system("pause");
	return 0;
}
copy 的使用
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <algorithm>  
#include <vector>  
using namespace std;

int main()
{
	int myints[] = { 10, 20, 30, 40, 50, 60, 70 };
	vector<int> myvector;
	vector<int>::iterator it;

	myvector.resize(7);   // 为容器myvector分配空间  

	//copy用法一:  
	//将数组myints中的七个元素复制到myvector容器中  
	copy(myints, myints + 7, myvector.begin());

	cout << "myvector contains: ";
	for (it = myvector.begin(); it != myvector.end(); ++it)
	{
		cout << " " << *it;
	}
	cout << endl;

	//copy用法二:  
	//将数组myints中的元素向左移动一位  
	copy(myints + 1, myints + 7, myints);   //不能对myints 的内存进行修改  输出的结果是 20 30 40 50 60 70 70

	cout << "myints contains: ";
	for (size_t i = 0; i < 7; ++i)
	{
		cout << " " << myints[i];
	}
	cout << endl;
	
	system("pause");
	return 0;
}
copy的用法3
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <algorithm>  
#include <vector>  
using namespace std;

int main()
{
	vector<int> v, k;	
	v.resize(5);
	for (int i = 0; i < 5; i++)
		v.push_back(i);
	vector<int>::iterator it = v.begin();
	vector<int>::iterator itend = v.end();
	copy(it, itend, ostream_iterator<int>(cout, " "));  //error   
}
三、输入输出流迭代器:

输入流迭代器:
template<class T>istream_iterator<T>
要求:T类型重载了运算符>>
以输入流为参数构造:
istream_iterator<int>(cin);
istream_iterator<int>(); 指向输入流结束位置


输出流迭代器:
template<class T>ostream_iterator<T>
要求:T类型重载了运算符<<
以输入出流为参数构造:
ostream_iterator<int>(cout);
ostream_iterator<int>(cout, 分隔符); 指向输入流结束位置

例:

#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

double square(double x)
{
	return x*x;
}
int main()
{
	transform(istream_iterator<double>(cin), istream_iterator<double>(), ostream_iterator<double>(cout, " "), square);//可以一直输入 并且会输出其平方
	cout << endl;
	
	system("pause");
	return 0;
}
//
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <algorithm>  
#include <vector>  
using namespace std;


template<class T,class InptuIterator,class OutputIterator>
void mySort(InptuIterator first, InptuIterator last, OutputIterator result)
{
	vector<T> s;
	for (; first != last; first++)
	{
		s.push_back(*first);
	}
	sort(s.begin(),s.end());
	copy(s.begin(),s.end(),result);
}
int main()
{
	vector<int> v;
	v.resize(5);
	double a[5] = {1.2 ,2.4,3.6,0.8,1.1};
	mySort<double>(a,a+5,ostream_iterator<double>(cout," "));
	cout << endl;
	mySort<int>(istream_iterator<int>(cin),
		istream_iterator<int>(), //要按 Ctrl + Z停止 表示结束输入
		v.begin());
	
	system("pause");
	return 0;
}
四、迭代器的辅助函数
对pos执行n次自增操作
void advance(iterator pos, int n) //不检查迭代器是否超过end()
计算两个迭代器first 和 last的距离 只有同一个容器中的元素才能进行+ -
int distance(iterator first, iterator last) //对first执行多少次"++"操作后能够使得 first == last
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <algorithm>  
#include <vector> 
#include <list>
int main()
{
	list<int> coll;
	for(int i = 1; i <= 9; i++)
	{
		coll.push_back(i);
	}
	list<int>::iterator pos = coll.begin();
	advance(pos, 2);
	cout << "pos->values is" << *pos <<endl;
	pos = find(coll.begin(), coll.end(), 6);
	if(pos != coll.end())
	{
		cout << distance(coll.begin(), pos) << endl;
	}
	
	system("pause");
	return 0;
}




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值