std :: unordered_set :: find-仅构造一个实例()

std::unordered_set::find - construct an instance only for find()

本文关键字:一个 实例 unordered set find- std      更新时间:2023-10-16

很多时候我看到我的 key实际上在我的 value中。
例如:

struct Elem {
    int key;
    // ... Other variables ...
}

这让我想使用std :: unordered_set代替 std::unordered_map,因为我已经将key存储在我的value中 - 无需浪费更多std::unordered_map'S .firstkey)的位置。

然后我开始使用std::unordered_set实施,然后到达我需要在std::unordered_set上执行find()的地方。
然后,我意识到我需要创建一个 empty-shell Elem,这样我就可以 find(),beacuse std::unordered_set::find获得了一个 Key for Input

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构建实例)

q。我想念什么吗?
q。有没有办法做find()并不浪费的方法?我的意思是,这不会使我创建一个我不想

的实例
  • 对我来说真的很奇怪 - 我已经应该拥有我要寻找的元素,或者至少是 empty -shell

选择数据结构以保存数据时,您需要考虑使用用例。

如果您想从密钥查找数据,则应使用map。如果您只想将唯一值存储在集合中,而无需查找它们,请使用set

我不明白为什么将元素插入map.emplace_back(elem.key, elem) vs set.emplace_back(elem)为什么这意味着您可以在路上,您可以将Elem查询为map.at(key)map[key]与具有创建空的elem

此外,std::set无论如何都会(大致)在水下做整个关键的东西。(来源:C 中的设置与映射之间有什么区别?)