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;
  }
}

ご覧のとおり、特にマルチマップ名を 3 回繰り返さなければなりません。これらすべてを処理する独自の関数を作成してから、単に 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 に答える