繁体   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