如果我有范围(一对 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_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))
...
这在一般情况下不适用的原因是根据 Alastair Meredith's paper , 算法,
mismatch
和partition_copy
返回一对来自不同范围的迭代器;minmax
返回一对可能根本不是迭代器的对象,如果它们是,则不能保证它们形成一个范围;minmax_element
可以返回一个范围,但它也可以返回一个反转的范围(例如,在反向排序的范围minmax_element
将返回{prev(last) , 首先
;equal_range
保证返回一个范围。
关于c++ - 基于范围的for循环可以在一个范围内工作吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530284/