如何在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