美文网首页
Effective STL 第28条

Effective STL 第28条

作者: 懒生活 | 来源:发表于2022-10-02 23:23 被阅读0次

正确使用reverse_iterator
对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的元素. 遍历的管用语句如下

vector<int> intVec = {1,2,3,4,5,56};
for (vector<int>::iterator it = intVec.begin(); it!=intVec.end();++it)
{
  ......
}

这里初学者往往会有两个误区.

误区1

一个是尝试用ierator逆序访问容器内部元素. 下面的运行代码存在很多问题.运行会直接崩溃. 问题1, 是尝试通过v.end得到容器的结束位置,然后通过迭代器-1的方式获取容器的最后一个元素. 这个方法对于vector ok, 但是有的个别容器一旦迭代器指到end是无法通过减法回退的. 逆向的起点即使通过这个方法找到,紧接这就会遇到问题2.
问题2: 迭代器类似指针,是不能比较大小确定元素的位置的. 通过迭代器的遍历,只能用等号选定起点, 用等号或不等号确定终点.

        vector<int> intVec = {1,2,3,4,5,56};
    vector<int>::iterator it = v.end();
    vector<int>::reverse_iterator rit;
    it = v.end();
    it = --it;
    for(;it>=v.begin();--it)
        cout << *it << endl;

所以真的要通过iterator逆向遍历容器会是很麻烦的事情,可以实现的代码如下

    vector<int>::iterator it = v.end();
    it = v.end();
    it = --it;
    for(;it!=v.begin();--it)
        cout << *it << endl;
        cout << *(v.begin()) <<endl;

所以真要逆序访问容器用reverse_iterator才是正确的

        vector v;
    vector<int>::reverse_iterator rit;
    for (rit = v.rbegin(); rit != v.rend(); ++rit)
        cout << *rit << endl;

误区2,在for语句中使用迭代器it++ 与 ++it 认为是一样的效果

从功能上来说是一样的.但性能上++it高出了很多.原因是++it这个运算返回的是引用. 而it++返回的临时对象. 虽然结果一样但it++会导致循环中大量的临时对象构建和析构.

reverse_iterator在使用中不可或缺, 和iterator的转换关系要慎重

reverse_iterator 通过base() 转换出来的iterator在位置上有一个偏移. 使用时要注意.

相关文章

  • EFFECTIVE+STL中文版:50条有效使用STL的经验

    《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所...

  • 常用的 STL 查找算法

    常用的 STL 查找算法 《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在...

  • Effective STL 第7条

    容器中的对象如果是指针,指针指向的资源,容器没有办法自动释放. 问题引出 容器在自己析构的时候,会把包含的对象逐个...

  • Effective STL 第28条

    正确使用reverse_iterator对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的...

  • Effective STL 第22条

    主要不要修改set mutipleSet的key

  • Effective STL 第30条

    如果是区间操作,注意确保容器具有足够的区间 这个很矛盾, 我们害怕使用数组,就是因为数组有可能越界.为了不去考虑数...

  • Effective STL 第31条

    准确的选择排序算法 如果要对一个数列进行完全的排序,那么用sort是个不错的选择.但是如果只是部分排序, 要考虑更...

  • Effective STL 第34条

    为什么有些算法需要排序的区间 binary_search算法是二分查找, 这种查找需要查找空间的序列是有序的. 为...

  • Effective STL 第19条

    理解相等于等价相等的基础是 == , 如果x==y成立,就说明x和y的值相等对于有顺序关系的容器, 为了顺序的存在...

  • Effective STL 第25条

    散列表: 用key可以作为索引快速找到对应的value. 且这些对象在容器里面不排序. 散列表和标准关联容器set...

网友评论

      本文标题:Effective STL 第28条

      本文链接:https://www.haomeiwen.com/subject/uktjartx.html