C++中STL各个迭代器详解

1、自C++11起可以用range-based for循环来所有元素,但有时并不需要处理所有元素,此时可以使用迭代器。

std::vector<int> vec {1,2,3,4,5,6,7,8,9,10};
for (auto n : vec){
    std::cout << n << endl;
}

2、迭代器中用来表现容器中的某个位置

  • operator * :返回当前位置上的原始值。如果该元素拥有成员,可用-->取用他它们。
  • operator  ++ :返回当前位置上的元素值,有些迭代器还可以使用operator ——退至前一元素。(注:“前置++”比“后置++”效率高)
  • operator == 和 !=:判断两个迭代器是否指向同一位置。
  • operator = :对迭代器赋值。

3、容器的begin()和end()

begin():返回一个迭代器,指向容器终点,即第一个元素(如果有的话)的位置。

end():返回一个迭代器,指向容器终点。终点位于最末元素的下一位置,又称“逾尾迭代器”。

 

4、range-based for循环VS迭代器

对容器而言rang-based for循环不过是个便捷接口,用来迭代它“所接收到的几何区间”内每一个元素。在循环体内,真实元素被“当前迭代器所指向的value”初始化。

(1)range-based for循环

for (type  elem : coll){

...

}

(2)迭代器

for(auto pos = coll.begin(), end = coll.end(); pos != end; ++pos+){

type elem = *pos;

...

}

 

5、迭代器的种类

(1)前向迭代器(Forward iterator) 只能够以累加操作符(increment operator) 向前迭代。

Class forward _list的迭代器就属此类。其他容器如unordered_ set、 unordered_multiset、 unordered_map和unordered_multimap 也都至少是此类别(但标准库其实为它们]提供的是双向迭代器[forward iterator]。

(2)双向迭代器(Bidirectional iterator)顾 名思义它可以双向行进:以递增(increment)运算前进或以递减(decrement) 运算后退。list. set、 multiset、 map 和multimap提供的迭代器都属此类。

(3)随机访问迭代器(Random-access iterator)它 不但具备双向迭代器的所有属性,还具备随机访问能力。更明确地说,它们提供了迭代器算术运算的必要操作符(和寻常指针的算术运算完全对应)。你可以对迭代器增加或减少- - 个偏移量、计算两迭代器间的距离,或使用<和>之类的relational (相对关系)操作符进行比较。vector, deque.array和string提供的迭代器都属此类。除此之外,STL还定义了两个类别:

●输入型迭代器(Input iterator) 向前选代时能够读取/处理value。 Input stream迭代器就是这样-一个例子。

●输出型迭代器(Output iterator) 向前迭代时能够涂写value。 Inserter 和output stream迭代器都属此类。

 

6、具体迭代器

(1)output迭代器

a、output迭代器允许一步一步前行并搭配writ动作。

可以一个一个元素地赋值,但不能使用output迭代器对同一区间迭代两次。无比较操作,无法检验output迭代器是否有效,或写入是否成功。

b、output迭代器的操作

c、通常,迭代器可用来读,也可用来写,几乎所有reading迭代器都有write 的额外功能,这种情况下它们]被称为mutable (可产生变化的)迭代器。

      一个典型的pure output迭代器例子是:“将元素写至标准输出设备(例如屏幕或打印机)”。如果采用两个output迭代器写至屏幕,第二个字将跟在第一个字后面,而不是覆盖(overwrite)第一个字。另一个典型例子是inserter,那是一种用 来将value 插入(insert) 容器内的迭代器:如果你赋值(assign) 一个value,你其实是将它插入(insert) 容器。如果随后写入第二个value,并不会覆盖第一个 value,而是安插进去。

(2)input迭代器

a、input迭代器只能一次一个以前行方向读取元素,按此顺序一个一个返回元素值。

input迭代器只能读取元素。如果复制input迭代器,并令input迭代器和新产生的拷贝都前向读取,可能会有不同的值。

b、input迭代器的操作

c、所有迭代器都具备input迭代器的能力,而且往往更强。Pure input迭代器的典型例子就是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值