如何在C++中获取std :: map的随机密钥?使用迭代器? 我不想要额外的数据结构来维护在C++中检索std :: map的随机密钥元素
6
A
回答
13
std::map
迭代器是双向的,这意味着选择一个随机密钥将是O(n)
。在不使用其他数据结构的情况下,基本上唯一的选择是使用std::advance
,其随机增量为begin()
。例如:
std::map<K, V> m;
auto it = m.begin();
std::advance(it, rand() % m.size());
K random_key = it->first;
(或使用(例如)std::mt19939
换出rand()
如果你有<random>
访问)。
1
这取决于你的目的是随机的。 std::map
是一个排序的容器,但不支持按元素编号随机访问。鉴于这一点和关键集合的知识,您可以使用lower_bound
或upper_bound
来随机选择要在其中查找地图的点,以便在该地点附近找到要素。这有一种趋势,即根据它们与地图中其他元素之间的差距来选择元素,这意味着如果元素/间隙本身是有效的随机元素,重复选择的随机元素将不会是初始结果平均分配。例如,假设您的密钥为大写字母,并且键“C”,“O”,“Q”和“S”在地图中。如果你从AZ生成一个随机字母,你很可能最终选择C,O或S而不是Q,因为只有PQR接近Q并且使用上限或下限,你最终会选择其中的两个,尽管只有4个元素,但仍有2/26的机会。尽管如此,如果选择C,O,Q和S时有一些随机性,那么你可能会认为差距和选择是随机的。
你可以通过像这样刺入容器,然后做一个随机数的迭代器增量/减量来改善,但它仍然不会是真正的随机数。
一个真正随机的结果需要推进一个一个遍历遍历列表或要避免的二级索引容器。
相关问题
- 1. 跨随机密钥检索子值-Firebase
- 2. C++ STL map,std :: pair作为密钥
- 3. 检索随机元素的ArrayList中
- 4. 更改std :: map中的值的密钥
- 5. Map实现Ruby检索密钥的值
- 6. 使用mpz_t作为std :: map的密钥
- 7. 波雷费密码随机密钥(C#)
- 8. 为std :: map生成唯一密钥
- 9. 使用std :: map部分匹配密钥
- 10. 检查std :: map中存在的值 - C++
- 11. C++ std :: map在未找到密钥时添加值
- 12. 检索由Firebase生成的随机ID密钥?
- 13. Simplejson和随机密钥值
- 14. 删除std :: map中的特定元素
- 15. Deserialise JSON与随机密钥
- 16. 索引多个密钥用于不同密钥组合中的随机查询
- 17. HashMap中元素的检索顺序是否真的随机化?
- 18. 如果元素在C++ std :: map中设置?
- 19. 随机密钥生成
- 20. 是AES密钥随机?
- 21. 从火力地堡与随机密钥
- 22. std :: vector随机向元素添加元素
- 23. 如何检查密钥是否存在于std :: map中,并在if条件中获取map :: iterator?
- 24. 从JArray中检索密钥
- 25. 从NSDictionary中检索密钥
- 26. 从密钥中检索表
- 27. 如何在std :: set中选择一个随机元素?
- 28. 如何防止随机检索Firebase数据库中密钥的冗余?
- 29. 在C++中std :: map键
- 30. 无法检索Map(HashMap)的所有密钥?
现在有'std :: next'。 :) – erip 2016-09-29 21:15:30