0

我需要使用 for_each 算法返回地图中的底部 10 个元素。由于某种原因,地图迭代器没有随机访问权限,所以我不能使用:

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

我可以在迭代器上使用 -- 运算符,但我宁愿不使用其中的十个!

那么有人可以让我知道是否有办法指定算法应该只考虑 10 个元素?

4

3 回答 3

3

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(), ...);
于 2013-05-21T00:20:31.403 回答
2

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);
于 2013-05-21T00:23:47.120 回答
2

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>);
于 2013-05-21T00:20:38.670 回答