STL--迭代器的使用及在opencv中用迭代器遍历所有的元素

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;
}
下面介绍在opencv中使用迭代器遍历所有的元素。

#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;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL(Standard Template Library)是C++标准库中的一个重要组成部分。它提供了一系列的模板容和算法,其中(Iterator)是STL中的一个重要概念。 是一种类似于指针的对象,用于遍中的元素。它提供了一组操作,包括解引用、移动等,使得我们可以在不了解容内部结构的情况下访问和操作容中的元素。 在STL中,分为五种类型: 1. 输入(Input Iterator):只能读取容中的元素,且只能进行单步前进操作。 2. 输出(Output Iterator):只能写入容中的元素,且只能进行单步前进操作。 3. 前向(Forward Iterator):可以读取和写入容中的元素,且可以进行多步前进操作。 4. 双向(Bidirectional Iterator):可以读取和写入容中的元素,且可以进行多步前进和后退操作。 5. 随机访问(Random Access Iterator):具有双向的所有功能,并且支持随机访问和指针算术运算。 对于不同的STL容,可以使用对应的类型来进行遍和操作。例如,对于vector容可以使用随机访问,对于list容可以使用双向。 以下是一个使用vector容的示例代码: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> nums = {1, 2, 3, 4, 5}; // 使用 std::vector<int>::iterator it; for (it = nums.begin(); it != nums.end(); ++it) { std::cout << *it << " "; } return 0; } ``` 在上述代码中,我们定义了一个vector容nums,并使用it进行遍。通过调用`begin()`函数可以获取指向容第一个元素,调用`end()`函数可以获取指向容最后一个元素之后位置的。在循环中,通过解引用操作`*it`来获取指向的元素的值。 需要注意的是,当遍结束后,会指向容最后一个元素之后的位置,即`nums.end()`。因此,循环条件中使用`it != nums.end()`来判断是否遍完成。 这只是使用的简单示例,STL中还有许多其他功能强大的算法和容可以与一起使用。通过灵活运用,我们可以更方便地操作和处理STL容中的元素

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值