一、迭代器简介
迭代器实际上是一种用来遍历容器元素的数据类型(作用类似与C语言的指针)。从此就可以看出,迭代器与容器的密切联系。我们知道,一些容器(如vector)可以通过[ ]来访问容器元素,但这种方式并不普遍,因为大多数的容器并不是数组实现的,也就不能用[]来访问容器元素。因此C++中就需要一种更加普遍的工具来提高效率,这就是迭代器。
迭代器是一种数据类型,一种变量。它也有几种类型,输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机迭代器。所以它支持++,--,>,<,>=,<=,==,!=。这些运算,针对的是迭代器的位置关系(如,两个迭代器相减,得到的是两个迭代器之间的距离)。但这些运算也根据它们的性质有所不同,如下。
输入迭代器 | 只进行输入功能。++,==,!= |
输出迭代器 | 只进行输出功能。++ |
前向迭代器 | 可读可写,可向前推进。++,==,!= |
双向迭代器 | 可读可写,可双向推进。++,==,!=,-- |
随机迭代器 | 可读可写,可跳跃访问。++,==,!=,--,- |
二、迭代器的使用
迭代器变量定义使用iterator关键字,形式为:容器<类型>::iteaator 变量名(如:std::vector<int>::iterator a)。
begin()/end(),rbegin()/rend()操作:这些操作对容器使用,可以返回一个迭代器类变量。其中,begin()返回的迭代器指向容器中的第一个元素,如果容器为空,则会返回一个特殊的标志。而end()返回的迭代器指向容器最后一个元素的后面,而不是最后一个元素,如果容器为空,则begin()和end()返回的迭代器相同。rbegin()/rend()刚好相反,它们返回一个反向迭代器,rbegin()返回的是反向迭代器的第一个元素,也就是容器的最后一个元素。rend()返回的是反向迭代器的最后一个元素的后面,也就是容器第一个元素的前面。
std::vector<int>::iterator iter;
std::vector<int> a{0,1,2,3,4,5};
iter=a.begin();
for(;iter!=a.end;iter++)
{
std::cout<<*iter<<std::endl;
}//输出容器a的元素
与C语言指针类似,迭代器也可以通过*运算符对所指向的容器进行访问。但const_iterator型迭代器不可以通过这种方式来修改所指向容器的值,但还是可以改变迭代器的指向。与相配对的,cbegin()/cend(),它们返回的都是常量迭代器,不能通过常量迭代器来修改容器中的内容。
三:迭代器失效问题
在使用迭代器的时,有时会遇到数据错乱或程序崩溃的情况,这有可能就是迭代器失效了。迭代器失效往往与迭代器所指向容器的的元素的增添或删减造成的。迭代器失是因为对容器元素增添或删减往往会使得某元素的地址发生改变,这时,原有的迭代器指向的内容已经被释放,从而失效。如果是全部地址发生改变,我们可以再次使用begin()/end()覆盖原先的迭代器。如果是单个元素的地址改变,我们可以用erase(*iterator)返回下一个有效迭代器的值。
总结
提示:这里对文章进行总结:
c++迭代器不仅可以对连续的数据结构遍历,还可以不连续的数据结构进行遍历。随着学习的深入,能够清晰地体会到迭代器的精妙之处。