【发布时间】: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(如果允许))。如果您需要循环体中的迭代器 - 而您的示例确实需要 - 通常最好使用基于范围的循环以外的替代方案。