【问题标题】:How to use the range based for loop iterator?如何使用基于范围的 for 循环迭代器?
【发布时间】:2019-04-27 05:28:58
【问题描述】:

我有这个插入排序算法的代码,我想知道是否存在与我正在使用的 for 循环等效的基于范围的 for 循环。

与常规 STL 容器迭代器相比,我对基于范围的循环迭代器的工作方式感到有些困惑。只是简单地替换 for(auto it:x) 显然是行不通的。

主要是,我的问题是如何取消引用基于范围的迭代器以获取相应的数组值。 这是我的插入排序代码:


for (auto it = x.begin(); it != x.end();it++)
 {
        auto insertloc = std::upper_bound(x.begin(), it, *it);

        std::rotate(insertloc, it, it + 1);
}

这段代码工作得很好,但我只是想知道我是否可以用基于范围的循环替换那个 for 循环。

【问题讨论】:

  • 但是您使用it 进行旋转,对吗?看来您无论如何都需要查找它。
  • for(auto it:x) 具有误导性,您得到的不是迭代器 it,而是序列的实际元素,因此在元素的位置在需要顺序。也就是说,您显示的代码是否有效也不清楚,edit 您的问题是为了澄清这一点。另外,作为这里的新用户,请使用tour 并阅读How to Ask
  • 当您只需要遍历集合并使用集合中的每个项目时,基于范围的 for 循环非常有用。如果您需要索引或迭代器,请坚持使用标准 for 循环。
  • 基于范围的 for 循环没有在循环体中提供迭代器。它提供值(例如for (auto element : container)for (int element : container),如果container 包含int 类型的元素)或对容器的受影响元素的引用(例如for (auto & element : container) {element = 5;} 可用于分配容器的所有元素到5(如果允许))。如果您需要循环体中的迭代器 - 而您的示例确实需要 - 通常最好使用基于范围的循环以外的替代方案。

标签: c++ loops pointers auto


【解决方案1】:

我想用基于范围的循环替换那个 for 循环。

这不适用于您的用例。当您只需要通过取消引用迭代器获得的对象的值时,range-for 循环就会起作用。它不适用于您的情况,因为您在循环中使用迭代器。没有标准机制可以让您从值中获取迭代器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 2017-03-20
    • 2022-01-14
    • 1970-01-01
    • 2014-09-13
    • 2014-10-28
    • 2020-11-10
    • 2020-10-05
    相关资源
    最近更新 更多