簡體   English   中英

用於快速查找的最佳STL容器

[英]Best STL container for fast lookups

我需要存儲一個整數列表,並很快確定整數是否已經在列表中。 不會存儲重復項。

我不會插入或刪除任何值,但我將附加值(可能實現為插入)。

什么是最好的STL容器類? 我在Google上找到了std::multimap ,但我似乎需要一個鍵/值對,我沒有。

我對STL很新。 我能得到一些建議嗎?

當值和鍵不是分開的時,您可以使用集合而不是映射。

您可以使用不存儲重復項的非多版本,而不是multiset / -map。

而不是集合,您可以使用std::unordered_set作為替代。 你的用例可能會更快。

還有其他一些不太通用的數據結構可用於表示整數集,其中一些可能更有效,具體取決於用例。 但標准庫不一定為您提供其他數據結構。

但我不清楚哪個查找速度最快。

對於查找而言,無序集具有比有序集更好的漸近復雜度。 無論您的用例更快,您都可以通過測量找到答案。

不可能超過一千左右

在這種情況下,漸近復雜性並不一定相關。

特別是對於像這樣的小型集合,有序矢量可以非常有效。 鑒於您“不會插入或刪除任何值” ,矢量也不應該有明顯的缺點。 標准庫不提供使用有序向量在內部實現的集合容器,但它確實提供了向量容器以及所有必需的算法。

我不知道容器如何計算哈希值。

您可以為無序容器提供哈希函數。 默認情況下,它使用std::hash std::hash使用實現定義的哈希函數。

std::unordered_set<int>是跟蹤int的重復的一個很好的選擇,因為插入和查找都可以在平均的恆定時間內實現。


插入

使用insert()成員函數可以實現在集合中插入新的int

std::unordered_set<int> s;
s.insert(7);

抬頭

檢查集合中是否存在給定的int可以使用find()成員函數完成:

bool is_present(const std::unordered_set<int>& s, int value) {
   return s.find(value) != s.end();
}

暫無
暫無

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

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