簡體   English   中英

C++ unordered_map 或 unordered_set :如果我想保留“isVisited”數據結構應該使用什么

[英]C++ unordered_map or unordered_set : What to use if I wish to keep an “isVisited” data structure

我想保留一個數據結構來存儲我迄今為止看到的所有元素。 考慮到為此保留一個數組是不可能的,因為元素可以是 10^9 的數量級,我應該使用什么數據結構來實現這一點:C++ 中的unordered_mapunordered_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.

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