如何确保STL算法只迭代容器中一定数量的元素
How to ensure an STL algorithm only iterates through a certain number of elements in a container?
我需要使用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);
相关文章:
- 擦除while循环中迭代的元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 高级选择排序 - 在一次迭代中搜索两个元素
- 访问要输出的矢量迭代器元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 位集元素迭代的抽象
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何将元素插入和迭代到这种映射.C++
- 如何通过查找迭代器结果分配给一组对的元素
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 无法将 std::set 中的元素迭代器插入到 std::list
- 使用std :: remove_reference获取STL容器的元素迭代器
- C++ 从地图的第二个元素迭代
- 在未排序向量中查找第 k 个最小元素(迭代)