【问题标题】:C++ - How to traverse a list from end to begin?C++ - 如何从头到尾遍历列表?
【发布时间】:2013-03-18 13:53:53
【问题描述】:

我想从头到尾显示我的列表。喜欢:

for (std::list<T>::const_iterator it = list.end(); it != list.begin(); --it)

问题是它在第一个元素(list.begin())时没有进入。我该怎么做?

【问题讨论】:

标签: c++ list for-loop stl


【解决方案1】:

使用 rbegin 和 rend 获取反向迭代器。

for (std::list<...>::reverse_iterator it=list.rbegin(); it!=list.rend(); ++it)

【讨论】:

  • 作为奖励,您可以使用auto:for( auto it=list.rend(); it!=list.rbegn(); ++it ) {...}
【解决方案2】:

使用反向迭代器:

for (std::list<...>::const_reverse_iterator it = l.rbegin(); it != l.rend(); ++it)

C++11

for (auto it = l.crbegin(); it != l.crend(); ++it)

请不要将您的std::list&lt;T&gt; 实例命名为list

【讨论】:

  • 我相信反向迭代器仍然应该从rbegin(最后一个元素)开始......然后转到rend(第一个元素),对吧?你的答案倒过来了。
  • @abelenky 是的,完全正确。我的 OP 代码剪切和粘贴失败。
【解决方案3】:

你想要一个reverse iterator。请参阅rbeginrend

【讨论】:

    【解决方案4】:

    补充:因为在it = list.end(); 中它得到=> 指针[一些内存块],它被理解为“结束”(或指向停止的位置,右边界或左边界)。所以输出它的内容 (cout

    std::list<...>::const_iterator it = list.begin();
      std::list<...>::const_iterator iTail = list.end();
      while(it!=iTail)
      {
          //do smthing
          ++it;
      }
    

    要么循环被跳过,要么你会从堆中得到一些垃圾。它是 const_iterator 的情况(没有阅读文档,但显然是为了“写”保护)。 在迭代器 std::list&lt;...&gt;::iterator 的情况下,只有 .end() 指向 last[element] => [end]。情况:

    std::list<...>::const_reverse_iterator 和 std::list<...>::reverse_iterator

    迭代器自动移动到第一个元素,具体取决于您将要遍历列表的start =&gt; endend =&gt;start

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 2012-10-08
      • 1970-01-01
      • 2018-01-27
      • 2021-12-24
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多