可以基于范围进行循环工作 [英] Can range based for loop work over a range
本文介绍了可以基于范围进行循环工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果我有范围(两个迭代器对),有没有办法为使用范围而不是原始数组或容器编写 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
andpartition_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 rangeminmax_element
will return{prev(last), first}
;equal_range
is guaranteed to return a range.
这篇关于可以基于范围进行循环工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文