c++ - 基于范围的for循环可以在一个范围内工作吗

标签 c++ c++11 foreach

如果我有范围(一对 2 个迭代器),是否有一种方法可以为使用范围而不是原始数组或容器编写“for each”循环。

像这样:

auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
    // ...
}

最佳答案

根据 Why was pair range access removed from C++11?您可以使用适配器,例如已接受答案的 as_rangeboost::make_iterator_range , 或者写你自己的:

template<typename It> struct range {
   It begin_, end_;
   It begin() const { return begin_; }
   It end() const { return end_; }
};
template<typename It> range<It> as_range(const std::pair<It, It> &p) {
   return {p.first, p.second};
}

auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: as_range(rng))
    ...

这在一般情况下不适用的原因是根据 Alastair Meredith's paper , 算法,

  • mismatchpartition_copy 返回一对来自不同范围的迭代器;
  • minmax 返回一对可能根本不是迭代器的对象,如果它们是,则不能保证它们形成一个范围;
  • minmax_element 可以返回一个范围,但它也可以返回一个反转的范围(例如,在反向排序的范围 minmax_element 将返回 {prev(last) , 首先;
  • equal_range 保证返回一个范围。

关于c++ - 基于范围的for循环可以在一个范围内工作吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530284/

相关文章:

php - 从post循环遍历多维数组并保存到mysql

c++ - 在 OpenCV 中执行 Eigenfaces 算法时出错

c++ - 引用函数的返回值

c# - 如何在 foreach 循环中为 char 变量赋值? C#

javascript - forEach中调用类函数 : how Javascript handles "this" keyword

c++ - 循环 std::unordered_map,序列总是我插入元素的序列?

c++ - 尝试使用 Boost-Spirit 解析类似 SQL 的语句

c++ - 为什么在 std::move 中使用 std::remove_reference ?

c++ - constexpr for 循环编译

c++ - 简单的线程/互斥测试应用程序崩溃