int a[5]=[0,1,2,3,4];
int *begin =a;
int *end=a+5;
for(int *point=begin;point!=end;++point)
cout<<*point<<" ";
如果存储空间是非连续的,不能通过对指向这种数据结构的指针做累加来遍历。能不能提供一个行为类似指针的类,来对非数组的数据结构进行遍历呢?这样我们可以以同样的方式来遍历所有数据结构(容器).
迭代器是指针的泛化,它允许程序员以相同的方式处理不同的数据结构(容器)..STL有五种不同类型的迭代器,它们分别满足一定的要求,不同的迭代器要求定义的操作不一样。
箭头表示左边的迭代器一定满足右边迭代器需要的条件。
迭代器提供了一种一般化的方法对顺序或关联容器类型中的每个元素进行连续访问。例如,假设Iter为任意容器类型的一个iterator,则++iter表示向前移动迭代器使其指向容器的下一个元素,而*iter返回Iterator指向元素的值,每种容器类型都提供一个begin()和一个end()成员函数。begin()返回一个迭代器 它指向容器的第一个元素,end()返回一个Iterator 它指向容器的末元素的下一个位置。通过迭代器,我们可以用相同的方式来访问、遍历容器。
int a[5]=[0,1,2,3,4];
vector<int> myvec(a,a+5);
for(int i=0;i<myvec.size();i++)//不使用迭代器
cout<<myvec[i]<<" ";
vector<int>::iterator it;
for(it=myvec.begin();it!=myvec.end();it++)//使用迭代器
cout<<*it<<" ";
迭代器的作用:
能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符,用以操作复杂的数据结构。
容器提供迭代器,算法使用迭代器。各个迭代器的功能如下:
迭代器类别 | 说明 |
输入 | 从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列 |
输出 | 向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列 |
正向 | 组合输入迭代器和输出迭代器的功能,并保留在容器中的位置 |
双向 | 组合正向迭代器和逆向迭代器的功能,支持多遍算法 |
随机访问 | 组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意 |
迭代器的操作:
迭代器操作 | 说明 |
所有迭代器 | |
p++ | 后置自增迭代器 |
++p | 前置自增迭代器 |
输入迭代器 | |
*p | 复引用迭代器,作为右值 |
p=p1 | 将一个迭代器赋给另一个迭代器 |
p==p1 | 比较迭代器的相等性 |
p!=p1 | 比较迭代器的不等性 |
输出迭代器 | |
*p | 复引用迭代器,作为左值 |
p=p1 | 将一个迭代器赋给另一个迭代器 |
正向迭代器 | 提供输入输出迭代器的所有功能 |
双向迭代器 | |
--p | 前置自减迭代器 |
p-- | 后置自减迭代器 |
随机迭代器 | |
p+=i | 将迭代器递增i位 |
p-=i | 将迭代器递减i位 |
p+i | 在p位加i位后的迭代器 |
p-i | 在p位减i位后的迭代器 |
p[i] | 返回p位元素偏离i位的元素引用 |
p<p1 | 如果迭代器p的位置在p1前,返回true,否则返回false |
p<=p1 | p的位置在p1的前面或同一位置时返回true,否则返回false |
p>p1 | 如果迭代器p的位置在p1后,返回true,否则返回false |
p>=p1 | p的位置在p1的后面或同一位置时返回true,否则返回false |
#include <iostream>
#include <vector>
int
main()
{
std::vector<
char
> charVector;
int
x;
for
(x=0; x<10; ++x)
charVector.push_back(65 + x);
int
size = charVector.size();
for
(x=0; x<size; ++x)
{
std::vector<
char
>::iterator start =
charVector.begin();
charVector.erase(start);
std::vector<
char
>::iterator iter;
for
(iter = charVector.begin();
iter != charVector.end(); iter++)
{
std::cout << *iter;
}
std::cout << std::endl;
}
return
0;
}
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat grayim(600, 800, CV_8UC1);
Mat colorim(600, 800, CV_8UC3);
//遍历所有像素,并设置像素值
MatIterator_<uchar> grayit,graynd;
for( grayit = grayim.begin<uchar>(), grayend =grayim.end<uchar>(); grayit != grayend; ++grayit)
*grayit = rand()%255;
//遍历所有像素,并设置像素值
MatIterator_<Vec3b> colorit, colorend;
for( colorit = colorim.begin<Vec3b>(), colorend =colorim.end<Vec3b>(); colorit != colorend; ++colorit)
{
(*colorit)[0] = rand()%255; //Blue
(*colorit)[1] = rand()%255; //Green
(*colorit)[2] = rand()%255; //Red
}
//显示结果
imshow("grayim", grayim);
imshow("colorim", colorim);
waitKey(0);
return 0;
}