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()
的位置
然后我意识到我需要创建一个空的shellElem
,这样我就能够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)
vsset.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在水下做所有的按键动作。”-我不在乎它在引擎盖下做什么。