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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: unordered_set :: find - 仅为find()构造一个实例相关的知识,希望对你有一定的参考价值。

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

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

这让我想用std::unordered_set而不是std::unordered_map,因为我已经将key存储在我的value内 - 不需要为std::unordered_map.firstkey)浪费更多的地方。

然后我开始用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++?

以上是关于std :: unordered_set :: find - 仅为find()构造一个实例的主要内容,如果未能解决你的问题,请参考以下文章

在 std::unordered_set<const char *> 中找不到转换为 const char * 的 std::string

对于操作计数()。 std::set<void*> 或 std::unordered_set<void*> 哪个更快?

我的班级有一个 toString() 方法,我如何使用它在 std::unordered_set 中进行散列?

g++5 中 std::unordered_set 编译错误的不完整类型,在 clang++ 中编译

set, unordered_set模板类

cpp►STL容器->哈希容器->unordered_set