目前,我只能使用以下方法进行基于范围的循环:
for (auto& value : values)
但有时我需要一个值的迭代器,而不是引用(无论出于何种原因)。有没有什么方法不需要经过整个向量比较值?
原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议
目前,我只能使用以下方法进行基于范围的循环:
for (auto& value : values)
但有时我需要一个值的迭代器,而不是引用(无论出于何种原因)。有没有什么方法不需要经过整个向量比较值?
原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议
Boost 有一个非常好的范围适配器 索引:
#include <boost/range/adaptors.hpp>
std::vector<std::string> list = {"boost", "adaptors", "are", "great"};
for (auto v: list | boost::adaptors::indexed(1)) {
printf("%ld: %s\n", v.index(), v.value().c_str());
}
输出:
1: boost
2: adaptors
3: are
4: great
这里我们从 1 ( boost::adaptors::indexed(1)
) 开始索引,但我们也可以轻松地从任何其他值开始索引。
它是一个索引,而不是迭代器,但迭代器最常见的用法是
所有这些也可以直接用索引来完成。另一方面,将循环内部的迭代器传递给其他地方以完全用作迭代器看起来是相当复杂的方法。
原文由 Audrius Meškauskas 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
使用旧的
for
循环:有了这个,你就有了
value
以及迭代器it
。使用你想使用的任何东西。编辑:
虽然我不建议这样做,但如果你想使用基于范围的
for
循环(是的, _无论出于何种原因_:D),那么你可以这样做:这种方法避免了搜索给定
value
,因为value
和it
总是同步的。