(C++)为什么需要反向迭代器?

RT。为什么不可以用正向迭代器进行反向遍历?
求各位指点。

阅读 5.3k
3 个回答

我觉得衍生正向和反向两种迭代器的

  • 好处是

从数据结构链的任意起点遍历到任意终点都能够以简洁的方式写出代码,而不用去绕脑子,容易出错。

  • 缺点是

为了节省程序员的脑力,数据结构可能变的更臃肿一些,空间成本变大,反向迭代器的执行效率也未必高。

说说我的看法:

auto itr = container.end();

此时*itr你就越界了,end()代表你容器最后一个元素的下一个位置。

反向迭代器确实没必要,看如下程序:

#include <iostream>
#include <list>

using namespace std;

int main()
{
    // list container for character elements
    list<char> coll;      

    // append elements from 'a' to 'z'
    for (char c='a'; c<='z'; ++c) {
        coll.push_back(c);
    }

    list<char>::const_iterator pos;
    for (pos = coll.begin(); pos != coll.end(); ++pos) {
        cout << *pos << ' ';
    }
    cout << "\n";
    
    //用正向迭代器倒序输出。
    for (pos = --coll.end(); pos != --coll.begin(); --pos) {
        cout << *pos << ' ';
    }
    cout << endl;
}

以上程序,输出结果是:

a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a

我们只要记住: [ begin(), end() ),是一个半开半闭区间,包括最左项,不包括最右项,begin()指向第一个元素,end()指向最后一个元素的下一个元素,就不会弄错。

用数组来举例,int a[10],其有效元素是a[0] -- a[9], a[10]则是内存越界了;同理,end()指向的内容等价于a[10],而不是a[9],其实也是内存越界了。

你的程序永远不应该访问end(),也就是说不要对end()进行*运算, 如同你的程序永远不要访问a[10],这两者都可能导致灾难性的程序错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题