很多时候,我看到我的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)
这么多麻烦如果它意味着你可以查询元素作为map.at(key)
或map[key]
与创建一个空的elem
。
此外,无论如何,std::set
做了整个关键的事情(大致)水下。 (来源:What is the difference between set vs map in C++?)