迭代器类似指针类型,提供了对对象的间接访问,使用迭代器可以直接访问某个元素,迭代器也能从一个元素移动到另一个元素,迭代器有有效和无效之分,有效的迭代器指向某个元素,或者指向容器中尾元素的下一个位置,其他所有情况都属于无效。
begin成员负责返回指向的第一个元素的迭代器。
end成员负责返回指向容器尾元素的下一个位置,该迭代器指示的是一个本不存在的尾后,end成员返回的迭代器通常被称作尾后迭代器。
迭代器运算符
==和!=来比较两个合法的迭代器是否相等,如果两个迭代器指向的元素相同或者都是同一个容器的尾后迭代器,则他们相等;否则它们不等。
和指针类似,也能通过解引用迭代器来获取它所指示的元素,此迭代器必须合法。
迭代器类型
iterator 和const_iterator来表示迭代器的类型;
const_iterator和常量指针差不多,能读取但不能修改它所指的元素值,iterator的对象可读可写,如果容器对象是一个常量,那么只能用const_iterator,不是常量两个都可以用。
迭代器和迭代器类型
迭代器类型有三种不同的含义:可能是迭代器概念本身,也可能是指容器定义的迭代器类型,还可以是某个迭代器对象。
重点的理解存在一组概念上的相关类型,我们认定某个类型是迭代器当且仅当它支持一套操作,这套操作使得我们能访问容器的元素或者从某个元素移动到另一个元素。
每个容器都定义了一个名为iterator的类型,该类型支持迭代器概念所规定的一套操作。
begin和end运算符
如果对象只需读操作而无需写操作做好使用常量类型,为了便于专门得到const_iterator类型,C++11引入了两个新函数,cbegin和cend .
不管容器本身是不是常量类型返回值都是const_iterator。
结合解引用和成员访问操作
解引用迭代器可以获得迭代器所指的对象,->箭头运算符,箭头运算符能把解引用和成员访问两个操作合在一起。
it->mem==(*it).mem
某些操作会使迭代器失效
不能在范围for循环中向vector容器对象中添加元素,另一种限制任何一种可能改变vector对象容量的操作,eg;push_back 都会使vector对象的迭代器失效。
WARNING:但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
迭代器的算术运算
两个迭代器相减的距离是指右侧迭代器向前移动多少位置就能追上左侧迭代器,类型为difference_type的带符号整型数,string和vector都定义了,因为这个距离可正可负,所以它是带类型的。