string的遍历(使用下标还是iterator)


迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象.

我们都知道可以用下标运算来访问string对象和vector对象。而另外还有一种更通用的方法也可以实现这样的方法。名曰:迭代器(iterator)。

类似于指针,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器有有效和无效之分,有效的迭代器指向某个元素或者容器中尾元素的下一个位置。其他情况均为无效。

和指针不一样的是,迭代器不是使用取址符,而是使用begin和end成员。 结合解引用和成员访问操作

解引用迭代器可以获得迭代器所指的对象,如果该对象的类型恰好是类,那么就可以访问这个类的成员。例如:

(*it).empty();

这里要注意it一定要加圆括号,否则会出错。如果不加,那么这句话的意思就变成了访问it的empty成员,但是it是个迭代器,没有empty成员。C++11中提供了箭头运算符->,箭头运算符把解引用和成员访问两个操作结合在了一起。故iter->mem 等价于(iter).mem。

强烈注意:一旦使用了迭代器的循环体,那就不要向迭代器所属的容器添加元素。

迭代器的算术运算:

iter + n 迭代器加上一个整数后仍是一个迭代器,在这里迭代器和指针很像,可以理解成地址上的加减。

iter1 - iter2 两个迭代器相减的结果是它们之间的距离。即所指向位置的距离。

<,<=,>,>= 迭代器关系运算符,如果某迭代器指向的容器位置在另一个迭代器所指位置之前,则说前者小于后者。

==============================================================

为何string vector可以使用下标访问,还设计了迭代器模式呢?

个人觉得: 1、STL设置的初衷是,算法 容器分离 2、迭代器更通用些,有的容器对象不支持下标 3、一些方法,比如erase只能传递iterator

就vector来说差别不大,迭代器其实就是原生指针,但是就C++整体容器来说还是迭代器好,像list这些容器等等,迭代器给你提供一个中间层,抽象掉各容器间的差异,让你能以相同的方式访问容器