一、迭代器的基本概念
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;
}