能否用std::generate生成随机std::unordered_multimap?替代方案是什么?
能否用
std::generate生成随机std::unordered_multimap? 答案是不能,我们先拆解下你的代码编译失败的原因,再给出最优的实现方式:
问题根源
std::unordered_multimap的元素类型是std::pair<const Key, T>——注意键是const修饰的。而std::generate的核心逻辑是遍历迭代器范围,对每个迭代器指向的元素执行赋值操作(*iter = generator())。但带const键的std::pair,其operator=是被删除的(你无法修改一个const对象),这就是编译器报错的核心原因。
最佳实现方式
既然赋值路径走不通,我们需要借助容器的insert操作来添加元素,这里有两种常用的优雅实现:
方法1:直接循环插入
这是最直观的方式,手动循环调用insert生成元素:
#include <unordered_map> #include <cstdlib> int main() { std::unordered_multimap<int, int> m; m.reserve(10); // 提前预留空间,避免频繁扩容 for (int i = 0; i < 10; ++i) { m.insert({std::rand(), std::rand()}); } }
方法2:用std::generate_n配合插入迭代器
如果你偏爱算法库的风格,可以用std::generate_n结合std::insert_iterator——插入迭代器会把赋值操作自动转换成容器的insert调用,完美避开const键的赋值限制:
#include <algorithm> #include <unordered_map> #include <iterator> #include <cstdlib> int main() { std::unordered_multimap<int, int> m; m.reserve(10); // 提前预留空间优化性能 std::generate_n( std::inserter(m, m.begin()), 10, [](){ return std::pair{std::rand(), std::rand()}; } ); }
额外提示
- 调用
reserve(10)是个好习惯:它会提前为哈希表分配足够的桶,减少插入过程中的扩容和重哈希操作,提升性能。 - 正如你提到的,实际项目中应该用
std::default_random_engine等C++标准随机数库代替std::rand(),后者的随机性和线程安全性都不够理想。
内容的提问来源于stack exchange,提问作者Przemysław Czechowski
相关产品推荐
相关产品推荐

