2013-03-27 42 views
1

我通过键向后循环与非重复的特别感兴趣:我可以把multimap迭代逻辑到另一个函数吗?

#include <map> 
#include <iostream> 
std::multimap<int,int> myMap = { 
    {1,2}, {1,2}, {2,2}, {2,2}, {3,2}, 
}; 

int main() { 
    using namespace std; 
    cout << "the keys backwards:" << endl; 
    typedef multimap<int, int> multimap_type; 
    typedef std::reverse_iterator<multimap_type::iterator> reverse_iterator; 
    for (auto it = myMap.rbegin(), end = myMap.rend(); it != end; it = reverse_iterator(myMap.lower_bound(it->first))) 
    { 
    cout << it->first << endl; 
    } 
} 

正如你看到的,我必须三次重复除其他事项外多重映射名称。我可以编写自己的函数来处理所有这些,然后简单地调用while或range for循环吗?这样的:

while((auto it = myIterFunc(myMap)) { 
    //... 
} 

for (auto it : myIterFunc(myMap)) { 
    //... 
} 

回答

2
​​

名称itmyIterFunc意味着你困惑的新的基于范围的for循环。变量it不是迭代器,它是范围的一个元素。函数myIterFunc不应该返回迭代器,它应该返回看起来像一个范围,即有begin()end()成员,允许迭代所需的范围。

可以在reverse使用Boost.Range适配器来遍历它:

#include <boost/range/adaptors.hpp> 
for (auto& val : boost::adaptors::reverse(myMap)) 
    cout << val.first << endl; 

你可以结合起来,与一个filter adaptor跳过重复键。 (有一个uniqued adaptor,但它使用==来确定唯一性,而不是只检查键)

相关问题