很多时候我看到我的 key
实际上在我的value
里面.
例如:
struct Elem {
int key;
// ... Other variables ...
}
这让我想使用 std::unordered_set而不是 std::unordered_map
,因为我已经有了 key
存储在我的 value
中- 无需为 std::unordered_map
浪费更多空间的 .first
(key
)。
然后我开始使用 std::unordered_set
来实现然后到达我需要执行 find()
的地方在我的std::unordered_set
.
然后我意识到我需要创建一个空壳 Elem
这样我就可以find()
, 因为 std::unordered_set::find
得到 Key
用于输入
template < class Key, // unordered_set::key_type/value_type
class Hash = hash<Key>, // unordered_set::hasher
class Pred = equal_to<Key>, // unordered_set::key_equal
class Alloc = allocator<Key> // unordered_set::allocator_type
> class unordered_set;
有时构建一个空壳 Elem
很难/浪费/甚至不可能吗?
例如,当我的键/值是
- 一个迭代器
- 引用
- 具有特定
c'tor
的类(不是只用key
构造实例)
问。我错过了什么吗?
<强>问。有没有办法做到find()
那不是浪费吗?我的意思是这不会让我创建一个我不想创建的实例
- 对我来说真的很奇怪 - 我应该已经有了我正在寻找的元素才能找到它,或者至少是它的一个空壳 .
最佳答案
在选择数据结构来保存数据时,您需要考虑您的用例。
如果你想从一个键中查找数据,你应该使用一个map
。如果您只想在集合中存储唯一值并且不需要查找它们,请使用 set
。
我不明白为什么插入一个元素如 map.emplace_back(elem.key, elem)
vs set.emplace_back(elem)
如此麻烦,如果这意味着以后您可以将 elem 查询为 map.at(key)
或 map[key]
而不是创建一个空的 elem
.
此外,std::set
还是(大致)在水下完成了整个关键的事情。 (来源:What is the difference between set vs map in C++?)
关于c++ - std::unordered_set::find - 仅为 find() 构造一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905284/