我可以将多图迭代逻辑放到另一个函数中吗?

时间:2013-03-27 13:11:26

标签: c++ c++11 iteration 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)) {
  //...
}

1 个答案:

答案 0 :(得分:2)

for ( auto it : myIterFunc(myMap)) {

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

您可以使用Boost.Range适配器在reverse中循环播放:

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

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