如果我有范围(一对2迭代器)有一种方法为该使用范围写入"for each"循环,而不是原始数组或容器.
像这样的东西:
auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
eca*_*mur 14
根据为什么从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))
...
Run Code Online (Sandbox Code Playgroud)
一般不适用的原因是根据Alastair Meredith的论文,算法,
mismatch并partition_copy从不同的范围返回一对迭代器;minmax 返回一对可能根本不是迭代器的对象,如果它们不存在则无法保证它们形成一个范围;minmax_element可以返回一个范围,但它也可以返回一个反转范围(例如,在反向排序范围内minmax_element将返回{prev(last), first};equal_range 保证返回范围.