C++ unordered_map如何遍历前K个元素 能否用for_each实现
错误原因
std::unordered_map的迭代器属于前向迭代器,仅支持自增、相等/不等比较操作,不支持随机访问的算术运算(如+、-),因此u_map.begin()+2属于非法写法,会触发编译错误。
实现方案
你可以通过以下几种方式拿到unordered_map的前K个条目:
- 注意:
std::unordered_map是无序容器,这里的“前K个”是哈希表内部存储顺序的条目,不遵循任何排序规则,如果你需要按key或value排序后的前K个,需要先将元素转存到std::vector再排序截取。
方法1:普通for循环实现(兼容性最好)
const int K = 2; int count = 0; for(auto it = u_map.begin(); it != u_map.end() && count < K; ++it, ++count) { std::cout << it->first << " " << it->second << std::endl; }
方法2:用std::for_each实现
通过lambda捕获计数器即可实现,适合必须用for_each的场景:
#include <algorithm> const int K = 2; int count = 0; std::for_each(u_map.begin(), u_map.end(), [&count, K](const std::pair<int, int>& item) { if (count >= K) return; std::cout << item.first << " " << item.second << std::endl; ++count; });
方法3:C++17及以上版本用std::for_each_n(性能最优)
std::for_each_n支持直接指定迭代次数,无需遍历全量容器,效率更高:
#include <algorithm> const int K = 2; std::for_each_n(u_map.begin(), K, [](const std::pair<int, int>& item) { std::cout << item.first << " " << item.second << std::endl; });
内容的提问来源于stack exchange,提问作者Vamsi Krishna
相关产品推荐
相关产品推荐

