[英]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.