2015-03-19 123 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