如果我有范围(两个迭代器对),有没有一种方法可以为使用范围而不是原始数组或容器编写“for every”循环。
像这样的东西:
auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
// ...
}
As per 为什么 C++11 中删除了对范围访问?您可以使用适配器,例如这as_range
在接受的答案中,boost::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))
...
这不适用于一般情况的原因是阿拉斯泰尔·梅雷迪思的论文,算法中,
-
mismatch
and partition_copy
返回一对来自不同范围的迭代器;
-
minmax
返回一对可能根本不是迭代器的对象,如果它们是迭代器,则不能保证它们形成一个范围;
-
minmax_element
可以返回一个范围,但也可以返回一个相反的范围(例如,在反向排序的范围上)minmax_element
将返回{prev(last), first}
;
-
equal_range
保证返回一个范围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)