如何确保STL算法只迭代容器中一定数量的元素

How to ensure an STL algorithm only iterates through a certain number of elements in a container?

本文关键字:元素 迭代 何确保 确保 算法 STL      更新时间:2023-10-16

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

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

我可以在迭代器上使用——操作符,但我不想使用十个这样的操作符!

所以有人能告诉我是否有一种方法可以指定算法应该只考虑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中,您可以使用std::advance(iter, dist)而不是调用++--十次。前进,通过正dist;要返回,传递一个负的dist:

auto ten_before(map.end());
std::advance(ten_before, -1);
std::for_each(std::map.end(), ten_before, -10), <lambda>);

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