迭代器的意义
除了使用下标运算符来访问string对象的字符或vector对象的元素,还有一种更通用的机制也可以实现同样的目的,这就是迭代器。
迭代器类似于指针类型,提供了对象的间接访问,其对象是容器中的元素或者string对象中的字符。
使用迭代器
获取迭代器不用取地址符,一般使用begin和end成员。
for(auto it = s.begin();it != s.end() && !isspace(*it);++it){
*it = toupper(*it);
}
这个例子中使用了很多迭代器的操作符。
迭代器类型
每个容器定义了一个名为iterator的类型,该类型支持迭代器概念所规定的一套操作。
一般来说我们不知道(其实也无须知道)迭代器的精确类型。
实际上,拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型
vector<int>::iterator it; //it能读写vector<int>的元素
string::iterator it2; //it2能读写string对象中的字符
vector<int>::const_iterator it3; it3只能读元素,不能写元素
string::const_iterator it4; it4只能读字符,不能写字符
如果vector对象是一个常量,只能用const_iterator;如果vector对象不是常量,则既能使用iterator,也能使用const_iterator。
begin和end运算符
begin和end返回的具体类型由对象是否是常量决定,如果是常量,begin和end返回const_iterator;不是则返回iterator。
有时候我们想要他返回const_iterator,则使用cbegin和cend。
某些对vector对象的操作会使迭代器失效
任何一种可能改变vector对象容量的操作,比如push_back,都会使vector对象的迭代器失效。