C++ std::unordered_set::find-仅为find()构造实例

C++ std::unordered_set::find-仅为find()构造实例,c++,c++11,stl,set,C++,C++11,Stl,Set,很多时候,我看到我的键实际上在我的值内 例如: struct Elem { int key; // ... Other variables ... } 这使我想使用而不是std::unordered_map,因为我已经在值中存储了键——无需为std::unordered_map浪费更多的空间。首先(键) 然后,我开始使用std::unordered\u集实现std::unordered\u集,然后到达需要对std::unordered\u集执行find()的位置 然后我意识到我

很多时候,我看到我的
实际上在我的
值内

例如:

struct Elem {
    int key;
    // ... Other variables ...
}
这使我想使用而不是
std::unordered_map
,因为我已经在
值中存储了
——无需为
std::unordered_map
浪费更多的空间。首先

然后,我开始使用
std::unordered\u集实现
std::unordered\u集,然后到达需要对
std::unordered\u集执行
find()
的位置 然后我意识到我需要创建一个空的shell
Elem
,这样我就能够
find()
,因为
std::unordered\u set::find
获取一个
,用于输入

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;
template类无序集;
有时构建一个空壳
Elem
很难/浪费/甚至不可能

例如,当我的键/值为

  • 迭代器
  • 推荐人
  • 具有特定
    c'tor
    的类(不仅使用
    键构建实例)
问:我是不是遗漏了什么?
Q.有没有一种不浪费的
find()
方法?我的意思是,这不会让我创建一个我不想创建的实例

  • 对我来说非常奇怪的事情-我已经拥有了我正在寻找的元素,以便找到它,或者至少是它的一个空壳

当选择数据结构来保存数据时,需要考虑用例。


如果要从键查找数据,应使用
映射
。如果您只想在集合中存储唯一值,而不需要查找它们,请使用
set

我不明白为什么插入一个元素如
map.emplace\u-back(elem.key,elem)
vs
set.emplace\u-back(elem)
会这么麻烦,如果这意味着你可以沿着这条路查询元素,就像
map.at(key)
或者
map[key]
vs创建一个空的
elem


除此之外,
std::set
还是会在水下完成整个按键动作。(来源:)

我强调了这个问题,你的标题是“std::无序集与std::无序图的权衡”,但你基本上是在问为什么
std::无序集
不能像
std::无序图
那样使用,对我来说并不奇怪,
包含唯一的值,它没有键的概念。如果您可以访问C++14并可以改为切换到
std::set
,则会有一个接受任何类型的重载。不过,您还需要实现一个自定义比较器。@路人-很抱歉这个标题-我想不出任何其他合适的名称。“如果您只想在集合中存储唯一的值,而不需要查找它们,请使用”-我不同意-在
std::set
中,您确实有一个
find()
方法。“我不明白为什么插入元素这么麻烦”-我说的是
find()
,而不是
insert()
。“此外,std::set在水下做所有的按键动作。”-我不在乎它在引擎盖下做什么。