[英]C++ unordered_map or unordered_set : What to use if I wish to keep an “isVisited” data structure
我想保留一個數據結構來存儲我迄今為止看到的所有元素。 考慮到為此保留一個數組是不可能的,因為元素可以是 10^9 的數量級,我應該使用什么數據結構來實現這一點:C++ 中的unordered_map
或unordered_set
?
在最壞情況下將訪問的最大元素: 10^5
-10^9 <= element <= 10^9
正如@MikeCAT 在評論中所說,只有當您想存儲有關元素或訪問的其他信息時,地圖才有意義。 但是如果你只想存儲元素是否被訪問過的真值,地圖看起來像這樣:
// if your elements were strings
std::unordered_map<std::string, bool> isVisited;
然后這只會浪費空間。 存儲真值是多余的,如果映射中字符串的存在已經表明它已經被訪問過。 我們來看一個對比:
std::unordered_map<std::string, bool> isVisitedMap;
std::unordered_set<std::string> isVisitedSet;
// Visit some places
isVisitedMap["madrid"] = true;
isVisitedMap["london"] = true;
isVisitedSet.insert("madrid");
isVisitedSet.insert("london");
// Maybe the information expires so you want to remove them
isVisitedMap["london"] = false;
isVisitedSet.erase("london");
現在存儲在每個結構中的元素將是:
For the map:
{{"london", false}, {"madrid", true}} <--- 4 elements
{"madrid"} <--- 1 element. Much better
在一個項目中,我將二叉樹轉換為二叉 DAG 以用於優化目的 ( GRAPHGEN ),我將探索函數從節點指針傳遞到bool
的映射:
std::map<BinaryDrag<conact>::node*, bool> &visited_fl
地圖會跟蹤指針,以便在進行多次傳遞時不會再次通過相同的節點。
您可以使用std::unordered_map<Value, bool>
。
我想保留一個數據結構來存儲我迄今為止看到的所有元素。
一種重新表述的方式,即“我想要一個數據結構來存儲我迄今為止看到的所有元素的集合”。 線索就在名字里。 沒有更多信息, std::unordered_set
似乎是表示集合的合理選擇。
也就是說,在實踐中這取決於細節,比如你打算用這個系列做什么。 Array 也是一個不錯的選擇(是的,即使對於數十億個元素),其他 set 實現可能更好,並且 map 在某些用例中很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.