如何在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. Map實現Ruby檢索密鑰的值
- 5. 波雷費密碼隨機密鑰(C#)
- 6. 使用std :: map部分匹配密鑰
- 7. 檢查std :: map中存在的值 - C++
- 8. C++ std :: map在未找到密鑰時添加值
- 9. 檢索由Firebase生成的隨機ID密鑰?
- 10. Simplejson和隨機密鑰值
- 11. HashMap中元素的檢索順序是否真的隨機化?
- 12. 索引多個密鑰用於不同密鑰組合中的隨機查詢
- 13. 隨機密鑰生成
- 14. 是AES密鑰隨機?
- 15. 從JArray中檢索密鑰
- 16. 從NSDictionary中檢索密鑰
- 17. 從密鑰中檢索表
- 18. 如何在std :: set中選擇一個隨機元素?
- 19. Cassandra - 如何檢索CF(隨機分區程序)中的所有密鑰
- 20. 如何防止隨機檢索Firebase數據庫中密鑰的冗餘?
- 21. 在C++中std :: map鍵
- 22. 從數組中檢索x個隨機元素
- 23. std :: map :: iterator單個元素遞減
- 24. 記住隨機選擇的密鑰
- 25. MongoDB組在密鑰中檢索爲空
- 26. 檢索隨機行()
- 27. C版本的C++ std :: map
- 28. 安全地檢索密鑰
- 29. Berkeley DB:僅檢索密鑰
- 30. 檢索Google Maps API密鑰
現在有'std :: next'。 :) – erip 2016-09-29 21:15:30