我们知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有一种更通用的机制也可以实现同样的目的,这就是迭代器
1. 迭代器的使用
获取迭代器不是使用取地址符,而是具有迭代器的类型同时会拥有返回迭代器的成员。比如:begin和end,其中begin成员负责返回指向第一个元素的迭代器,end成员负责返回指向容器尾元素的下一位的迭代器,也就是说,该迭代器自带的元素是一个本不存在的“尾后”元素,这样的迭代器仅作为一个标记,表示我们已经处理完容器中的所有元素。如果容器为空,则begin和end返回的是同一个迭代器,即尾后迭代器!
- 迭代器的运算符
*iter //返回迭代器iter所指元素的引用
iter->men //解引用iter并获取该元素的名为men的成员,等价于(*iter.men)
++iter //令迭代器指向容器中的下一个元素
iter1==iter2 //判断两个迭代器是否相等
示例:将字符串的第一个字母大写!
string s("some string");
if(s.begin() !=s.end())
{
auto it=s.begin();
*it=toupper(*it);
}
string s("some string");
for(auto it=s.begin();it !=s.end() && !isspace(*it);++it)
*it=toupper(*it);
- 迭代器的类型
就像不知道string和vector的size_type成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:
vector<int>::iterator it;
string::iterator it2;
结合解引用和成员访问操作:
(*it).emty()
it->empty(); //这两种方式实现的效果是相同的
注意:任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
- 迭代器的运算
iter + n
iter+=n
iter1-iter2
iter1<iter2
迭代器可以实现类似的运算功能
至此,迭代器的介绍结束!