iterator
在回顾使用string和vector容器的时候,用到了iterator(迭代器),这里把一些容易忽略的要点总结如下:
为什么要用迭代器啊?直接采用下标运算符[ ]不可以吗?
首先要明确一点,iterator是提供对对象的间接访问的,类似于指针的作用。
它们适用范围不同
iterator对于任何容器都是使用的,而[ ]下标运算符只对于string和vector这种存储在连续的内存空间上的容器有效,对于像list、forward_list等容器则不适用。
因此,最好在所有场合下使用iterator,而不是[ ]!!!
iterator运算符(适用于所有容器)
- iter->mem
- *iter
- ++iter
- –iter (forward_list 不支持递减操作,因为是单向链表)
- iter1==iter2
- iter1 != iter2
特有的运算符(string和vector独有,因此它们在内存空间中是连续的)
- iter+n
- iter - n
- iter += n
- iter -=n
- iter1 - iter2
- > 、 >= 、 < 、<=
iterator的类型
无须知道它的确切类型,使用iterator和const_iterator来表示iterator的类型
eg:
vector < int > ::iterator it1;
string::iterator it2;
vector < int > ::const_iterator it3;
string::const_iterator it4;
在使用的时候,也可以使用auto表示它们的类型;
for(auto it=v.begin();it != v.end();++it)
{
cout<<*it<<endl;
}
iterator的范围
由一对迭代器表示,分别为begin和end;
begin:指向容器中的首元素
end:指向容器中尾元素的下一个位置
是一个左闭右开的区间,[ begin,end ),end指向的元素不在范围内
它的好处在于
判断范围为空时:只需要判断begin != end 就行了,一般用在循环体的结束条件
iterator的成员——begin和end
begin和end返回的都是iterator类型
cbegin和cend返回的是const_iterator类型,不可以修改迭代器指向的内容
需要注意的是:可以将一个普通的iterator类型转换成const_iterator类型,反之则不行。权限只能变小,而不能变大。