2015-03-19 113 views
3

考虑与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不提供这种类型的使用这种代理或适配器,什么是实现这些要求的?我在想,我需要重载免费功能beginend,并且还要为std::pair<T,U>定义一个适配器迭代器类。我只是在对其进行概念刺探,但请让我知道!在此先感谢大家。

回答

8

不,范围为电话std::beginstd::endstd::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

+0

您的'iter_pair_range'类假设这两个对中的两个类型都是相同的类型,这在我的示例中不是这种情况。 – 2015-03-19 12:51:02

+0

@ void.pointer你是什么意思? Equal_range将始终返回一对相同类型 – Rado 2015-03-19 12:54:32

+1

@ void.pointer对中的类型不相同,但迭代器类型是。在两种情况下它都是'multimap :: const_iterator'。事实上,基于范围的for甚至不会用'begin()'和'end()'返回不同类型的迭代器。 – JorenHeit 2015-03-19 12:55:22

3

基于模板的答案可能是你正在寻找的,但我会用for_each而不是lambda。它更清洁,更容易消化。

+0

我最终使用了你的建议,我甚至没有考虑过'std :: for_each'。它更简单。但是,我的问题特别要求基于范围的解决方案,因此我打算接受这一答案。感谢您的提醒! – 2015-03-19 12:59:09