是否可以使用基于范围for循环与迭代器范围?
考虑与std::multimap
使用,在那里我给出了一系列的迭代器:现在是否可以使用基于范围for循环与迭代器范围?
std::unordered_multimap<std::string, MyObject> mymap;
auto& range = mymap.equal_range("some_key");
for (auto& the_pair : range)
{
}
,上面的代码无法编译,但我用它来演示目的。是否有可能像这样使用一对迭代器使用基于范围的for循环?我不认为这是直接可能的,所以我想我的问题是关于在这个用例中STL中是否有适配器类。我可以写我自己的,但这似乎是一个常见的情况。
更新:
如果这不是一个常见的情况和STL不提供这种类型的使用这种代理或适配器,什么是实现这些要求的?我在想,我需要重载免费功能begin
和end
,并且还要为std::pair<T,U>
定义一个适配器迭代器类。我只是在对其进行概念刺探,但请让我知道!在此先感谢大家。
不,范围为电话std::begin
和std::end
。 std::pair
没有任何过载。有一次,这个feature existed in a draft standard但被删除。你可以编写你自己的代码。从sellibitze偷窃:
template<class Iter>
struct iter_pair_range : std::pair<Iter,Iter> {
iter_pair_range(std::pair<Iter,Iter> const& x)
: std::pair<Iter,Iter>(x)
{}
Iter begin() const {return this->first;}
Iter end() const {return this->second;}
};
template<class Iter>
inline iter_pair_range<Iter> as_range(std::pair<Iter,Iter> const& x)
{ return iter_pair_range<Iter>(x); }
int main() {
std::unordered_multimap<std::string, MyObject> mymap;
auto range = mymap.equal_range("some_key");
for (auto& the_pair : as_range(range))
{
}
}
你可以看一下n2995从2009年它谈到加入远程支持的标准库。也许你最好用Boost.Range。
基于模板的答案可能是你正在寻找的,但我会用for_each而不是lambda。它更清洁,更容易消化。
我最终使用了你的建议,我甚至没有考虑过'std :: for_each'。它更简单。但是,我的问题特别要求基于范围的解决方案,因此我打算接受这一答案。感谢您的提醒! – 2015-03-19 12:59:09
您的'iter_pair_range'类假设这两个对中的两个类型都是相同的类型,这在我的示例中不是这种情况。 – 2015-03-19 12:51:02
@ void.pointer你是什么意思? Equal_range将始终返回一对相同类型 – Rado 2015-03-19 12:54:32
@ void.pointer对中的类型不相同,但迭代器类型是。在两种情况下它都是'multimap :: const_iterator'。事实上,基于范围的for甚至不会用'begin()'和'end()'返回不同类型的迭代器。 –
JorenHeit
2015-03-19 12:55:22