【问题标题】:Why (Qt 5.15.2) STL-Style Reverse Iterators cannot be used for print from begin to end?为什么(Qt 5.15.2)STL 风格的反向迭代器不能用于从头到尾的打印?
【发布时间】:2021-03-28 13:32:41
【问题描述】:

我正在尝试在 Qt 中使用 STL 样式的迭代器。当我构建 for 循环时:

for(auto i = list.rbegin(); i != list.rend(); ++i)
{ }

它可以工作,但如果我像这样构建:

for(auto i = list.rend(); i != list.rbegin(); --i)
{ }

它不起作用并给出错误。我想知道为什么我不能从头到尾使用反向迭代器。任何解释或来源都会有所帮助。

#include <QString>
#include <QDebug>
#include <QList>


int main() {
    QList<QString> list;
    list << "A" << "V" << "C" << "D";

    // this works
    for(auto i = list.rbegin() ; i != list.rend(); ++i) 
    { }

    // error: this doesn't work
    for(auto i = list.rend(); i != list.rbegin(); --i) 
    {
        *i = i-> toLower();
        qDebug() << *i;
    }
}



【问题讨论】:

  • 这个错误是秘密吗? “它不起作用”没有帮助。
  • 除非QList&lt;...&gt; 是奇数,否则迭代本身应该可以工作。访问数据是不同的:反向迭代与正向迭代不是对称的,因为您需要在访问值之前递减。
  • @DietmarKühl Dereferencing a reverse iterator does that for you;问题在于取消引用过去的迭代器。从这个意义上说,它与任何其他类型的迭代器相同。
  • @AsteroidsWithWings reverse_iterator 确实在与前向迭代一起使用时提供了反向视图。悬停,反向迭代,即使用—it而不是++it遍历需要在取消引用(—it)之前执行第一步(*it),以避免访问过去的值-iterator - 与使用的迭代器类型无关。
  • @DietmarKühl 这是正确的,我的回答是这样的;)我认为我们说的是同一件事,但是 OP 对反向迭代器范围进行反向迭代的奇怪选择导致了一些令人困惑的冲突术语:)

标签: c++ qt stl iterator


【解决方案1】:

您不能取消引用过去的迭代器。这不是反向迭代器独有的。

这是正确的:

if (!list.empty())
{
   for (i = list.rend()-1; ; --i)
   {
       // your code here
       
       if (i == list.rbegin())
          break;
   }
}

……但它很丑。

如果您想反转循环的方向,请从反向迭代器切换回正常的迭代器:

QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
{
   // your code here
}

这种丑陋是我们首先使用反向迭代器的原因。

【讨论】:

  • @Ghasem Ramezani 感谢您的建议,但这是一个很好的例子,说明为什么 AAA 是愚蠢的货物崇拜。 auto 这里隐藏了类型,这个问答的重点是迭代器类型。我们想看到它。我们需要看到它。在此答案中将其交换为 auto 只会进行混淆和勾选,这两者都没有用。
  • 我知道迭代器,但我只想尝试反向迭代器。顺便说一句,谢谢。
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
相关资源
最近更新 更多