我需要使用 for_each 算法返回地图中的底部 10 个元素。由于某种原因,地图迭代器没有随机访问权限,所以我不能使用:
std::for_each(std::map.end(), std::map.end()-10, <lambda>);
我可以在迭代器上使用 -- 运算符,但我宁愿不使用其中的十个!
那么有人可以让我知道是否有办法指定算法应该只考虑 10 个元素?
我需要使用 for_each 算法返回地图中的底部 10 个元素。由于某种原因,地图迭代器没有随机访问权限,所以我不能使用:
std::for_each(std::map.end(), std::map.end()-10, <lambda>);
我可以在迭代器上使用 -- 运算符,但我宁愿不使用其中的十个!
那么有人可以让我知道是否有办法指定算法应该只考虑 10 个元素?
Use auto x = your_map.end();
std::advance(x, -10);
.
Note that as you have the iterators now, however, that won't do much good. You need the beginning of the range first -- if you use whatever.end()
as the first parameter to for_each
, it won't work correctly.
If you want to iterate through the map in reverse order, you could use:
auto s your_map.rbegin();
advance(s, 10);
std::for_each(s, your_map.rend(), ...);
std::advance
正如其他答案所推荐的那样。但是在 C++11 中使用更方便std::prev
,它返回结果迭代器而不是更改给定的迭代器,因此它可以在单行中使用:
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);
In C++11 you can use std::advance(iter, dist)
instead of calling ++
or --
ten times. To go forward, pass positive dist
; to go backward, pass a negative dist
:
auto ten_before(map.end());
std::advance(ten_before, -1);
std::for_each(std::map.end(), ten_before, -10), <lambda>);