迭代器类似于指针类型,提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符,迭代器可以从一个元素移动到另外一个元素。
迭代器有有效和无效之分:有效的迭代器指向某个元素或者指向容器尾元素的下一位置,其他所有情况为无效。
和指针不一样的是没获取迭代器不需要取地址符,有迭代器的类型同时拥有返回迭代器的成员。这些类型都有begin和end成员。
begin负责返回指向第一个元素(或第一个指针)的迭代器。
end返回的迭代器常被称为尾后迭代器,指向的是容器中一个本不存在的“尾后”元素。
cbegin和cend的返回类型一定是const_iterator
(*it).empty表达的意思一样。
但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素,否则会使迭代器失效。
迭代器运算:
迭代器有有效和无效之分:有效的迭代器指向某个元素或者指向容器尾元素的下一位置,其他所有情况为无效。
和指针不一样的是没获取迭代器不需要取地址符,有迭代器的类型同时拥有返回迭代器的成员。这些类型都有begin和end成员。
begin负责返回指向第一个元素(或第一个指针)的迭代器。
end返回的迭代器常被称为尾后迭代器,指向的是容器中一个本不存在的“尾后”元素。
如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。
注意:因为end返回的迭代器并不实际指示某个元素,所以不能对其进行递增或解引用操作。
迭代器运算符:
迭代器类型:iterator 和 const_iterator
vector<int>::iterator it //能读写元素
string::const_iterator it2 //只能读,不能写元素
begin和end的返回类型由对象是否是常量决定,如果对象是常量返回const_iterator,如果不是返回iterator
cbegin和cend的返回类型一定是const_iterator
解引用迭代器可获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能希望进一步访问它的成员。
如string对象的迭代器:
(*it).empty; //解引用it,调用empty成员
*it.empty; //错误:视图访问it的empty成员,但是it是迭代器,没有empty成员
为了简化上述操作,C++定义了箭头运算符(->),箭头运算符把解引用和成员访问两个操作结合在一起,也就是说,it->empty和
(*it).empty表达的意思一样。
但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素,否则会使迭代器失效。
迭代器运算:
只要两个迭代器指向的是同一个容器中的元素或者尾元素的下一位置,就能将其相减,所得的结果是两个迭代器的距离。所谓的
距离指的是右侧迭代器向前移动多少距离就能追上左侧的迭代器,其类型名为difference_type的带符号整型数。string和vector
都定义了difference_type,因为这个距离可正可负,所以difference_type都是带符号类型。