簡體   English   中英

std :: map引用鍵的行為

[英]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范圍內的隨機數。結果:

  • 數組:1.27s
  • 向量:1.36s
  • 無序地圖:2.6秒
  • 映射:11.6s在這種簡單情況下,循環+索引計算的開銷為〜0.8s。

因此,這完全取決於在其他地方花費了多少時間。 如果要多得多(每100000000次迭代),則使用什么都無所謂。 但是,如果不是這樣,那可能會有所不同。

您可以使用hash_map,它是鍵值類型最快的數據結構;

也可以使用地圖,但是比hash_map慢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM