0

for_each アルゴリズムを使用して、マップの下位 10 要素を返す必要があります。何らかの理由で、マップ反復子にはランダムアクセスがないため、使用できません:

std::for_each(std::map.end(), std::map.end()-10, <lambda>);

-- 演算子をイテレータで使用できますが、10 個も使用したくありません。

では、アルゴリズムが 10 個の要素のみを考慮するように指定する方法があるかどうか、誰かに教えてもらえますか?

4

3 に答える 3

3

を使用しauto x = your_map.end(); std::advance(x, -10);ます。

ただし、現在イテレータを使用しているため、あまり効果がないことに注意してください。最初に範囲の先頭が必要です。whatever.end()最初のパラメータとしてを使用すると、for_each正しく機能しません。

マップを逆の順序で反復処理する場合は、次を使用できます。

auto s your_map.rbegin();
advance(s, 10);

std::for_each(s, your_map.rend(), ...);
于 2013-05-21T00:20:31.403 に答える
2

C++11 では、 orを10 回std::advance(iter, dist)呼び出す代わりに使用できます。先に進むには、 Positive を渡します。戻るには、負の値を渡します:++--distdist

auto ten_before(map.end());
std::advance(ten_before, -1);
std::for_each(std::map.end(), ten_before, -10), <lambda>);
于 2013-05-21T00:20:38.670 に答える
2

std::advance他の回答が推奨するように機能します。std::prevしかし、C++11では、指定された反復子を変更する代わりに、結果の反復子を返すを使用する方が便利なため、ワンライナーで使用できます。

std::for_each(std::prev(mymap.end(), 10), mymap.end(), func);

注:上記のイテレータの順序を修正しました。例ではイテレータが逆になっています。

最後の要素から始めて、最後の 10 項目を逆順に繰り返したい場合は、逆反復子と を使用できますstd::next

std::for_each(mymap.rbegin(), std::next(mymap.rbegin(), 10), func);
于 2013-05-21T00:23:47.120 に答える