for_each アルゴリズムを使用して、マップの下位 10 要素を返す必要があります。何らかの理由で、マップ反復子にはランダムアクセスがないため、使用できません:
std::for_each(std::map.end(), std::map.end()-10, <lambda>);
-- 演算子をイテレータで使用できますが、10 個も使用したくありません。
では、アルゴリズムが 10 個の要素のみを考慮するように指定する方法があるかどうか、誰かに教えてもらえますか?
for_each アルゴリズムを使用して、マップの下位 10 要素を返す必要があります。何らかの理由で、マップ反復子にはランダムアクセスがないため、使用できません:
std::for_each(std::map.end(), std::map.end()-10, <lambda>);
-- 演算子をイテレータで使用できますが、10 個も使用したくありません。
では、アルゴリズムが 10 個の要素のみを考慮するように指定する方法があるかどうか、誰かに教えてもらえますか?
を使用し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(), ...);
C++11 では、 orを10 回std::advance(iter, dist)
呼び出す代わりに使用できます。先に進むには、 Positive を渡します。戻るには、負の値を渡します:++
--
dist
dist
auto ten_before(map.end());
std::advance(ten_before, -1);
std::for_each(std::map.end(), ten_before, -10), <lambda>);
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);