[英]std::map's behavior on referring to a key
我正在使用std :: map編寫一些用於數值模擬的程序,以存儲一些鍵-值對。 該圖用作存儲仿真過程中演變的狀態。 鍵的類型是整數,並且與鍵相對應的值表明相同鍵(即std :: map)的副本數。 對於模擬的每個步驟,我需要計算同一鍵有多少個值,因此我將通過以下代碼進行檢查
if (map[key]>0) {do something here with the number of copies}
但是,我很快發現該代碼不起作用,因為即使地圖中沒有這樣的鍵,只要您調用map [key],它都會為該鍵生成一個占位符並將其值設置為零; 因此,我總是通過std :: map.size()來誇大鍵的總數。 我稍后將代碼更改如下,以搜索關鍵字
if (map.find(key)!=map.end()) {...}
那么,這是檢查地圖密鑰是否存在的唯一,最快的方法嗎? 我將運行仿真數億次,它將非常頻繁地調用上述代碼來檢查密鑰。 改用map.find()會不會太慢? 謝謝。
find
成員函數可能是查找鍵是否已在映射中的最快方法。 也就是說,如果您不需要按順序遍歷地圖中的項目,則可以使用std::unordered_map
來獲得更好的性能。
在std::map
或hashtable( std::unordered_map
)中, find
函數非常快,與使用[]
下標運算符一樣快。 實際上,找不到元素會更快,因為不必插入元素。
我認為檢查密鑰是否存在的各種方式的速度沒有太大差異。 另一方面:如果您的鍵是整數並且知道范圍,則可以只使用數組。
順便說一句:我對簡單數組,向量,圖和無序圖的速度感興趣。 我編寫了一個簡單的程序,它執行100000000 container [n] ++,其中n是0到10000范圍內的隨機數。結果:
因此,這完全取決於在其他地方花費了多少時間。 如果要多得多(每100000000次迭代),則使用什么都無所謂。 但是,如果不是這樣,那可能會有所不同。
您可以使用hash_map,它是鍵值類型最快的數據結構;
也可以使用地圖,但是比hash_map慢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.