1、所有标准库容器都可以使用迭代器,但只有少数几种才同时支持下标运算符。
2、string对象不属于容器类型,但string支持很多与容器类型类似的操作,故string对象也支持迭代器。
3、迭代器与指针类型非常相似,也提供了对对象的间接访问。
使用迭代器可以访问某个元素,也可以从一个元素移动到另一个元素。
迭代器有有效和无效之分,有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置;其他所有情况都属于无效。
4、有迭代器的类型,同时拥有返回迭代器的成员。
vector<int> i{0,1,2,3};
auto x=i.begin();//指向i的第一个元素的迭代器
auto y=i.end();//指向I的“尾元素的下一个位置”的迭代器,也就是容器的一个本不存在的“尾后”元素,常被称为“尾后迭代器”或“尾迭代器”
如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。
注:任何一种可能改变vector对象容量的操作都会使给对象的迭代器失效。
5、*iter //解引用操作,返回迭代器iter所指元素的引用。试图解引用一个非法迭代器或者尾后迭代器都是未被定义的行为。
6、iter->mem //(如果iter中的元素的类型恰好是类)解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem
vector<string> i;
auto iter=i.begin();
iter->empty();
7、迭代器类型:
7.1、iterator:可以修改它所指的元素值。
7.2、const_iterator:类似于指针常量(底层const),能读取但不能修改它所指的元素值,并且可以指向别的元素。
如果vector对象或string对象是一个常亮,只能使用const_iterator;如果vector对象或string对象不是常亮,那么既能使用iterator也能使用const_iterator。
为了专门得到const_iterator类型的返回值,C++11新标准引入了两个新函数,分别是cbegin和cend。类似于begin和end,新引入的这两个函数分别同之前一样返回容器第一个和最后元素下一位置的迭代器。不同的是,不论容器或string对象本身是否是常量,返回值都是const_iterator类型的。
8、我们认定某个类型是迭代器当且仅当它支持一套操作,这套操作使得我们能访问容器的元素或者从某个元素移动到另一个元素。每个容器都定义了一个名为iterator的类型,该类型支持迭代器概念所规定的一套操作。