1

我对通过不重复的键向后循环特别感兴趣:

#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 loop 吗?像那样:

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

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

1 回答 1

2
for ( auto it : myIterFunc(myMap)) {

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

您可以使用 Boost.Range 适配器反向循环:

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

您可以将其与过滤器适配器结合使用以跳过重复的键。(有一个唯一的适配器,但它用于==确定唯一性,而不仅仅是检查键)

于 2013-03-27T13:20:46.690 回答