可以基于范围进行循环工作 [英] Can range based for loop work over a range

查看:66
本文介绍了可以基于范围进行循环工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有范围(两个迭代器对),有没有办法为使用范围而不是原始数组或容器编写 for each循环。

If I have range (pair of 2 iterators) is there a way to write "for each" loop for that uses range, not a raw array or container.

这样的事情

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


推荐答案

按照为什么从C ++ 11中删除了对范围访问?您可以使用适配器,例如 as_range 接受的答案, boost :: make_iterator_range ,或编写自己的内容:

As per Why was pair range access removed from C++11? you can use an adaptor e.g. the as_range at the accepted answer, boost::make_iterator_range, or write your own:

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的论文

The reason this isn't applicable in general is that per Alastair Meredith's paper, of the algorithms,


  • 不匹配 partition_copy 返回一对不同范围的迭代器;

  • minmax 返回一对可能根本不是迭代器的对象,如果存在则不能保证它们形成一个范围;

  • minmax_element 可以返回范围,但也可以返回反向范围(例如,在反向排序的范围 minmax_element 上将返回 {prev(last), first} ;

  • equal_range 保证返回范围。

  • mismatch and partition_copy return a pair of iterators from different ranges;
  • minmax returns a pair of objects that may not be iterators at all, and if they are there's no guarantee they form a range;
  • minmax_element can return a range, but it can also return a reversed range (e.g. on a reverse-sorted range minmax_element will return {prev(last), first};
  • equal_range is guaranteed to return a range.

这篇关于可以基于范围进行循环工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆