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

标签 c++ c++11 stl set

很多时候我看到我的 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) 如此麻烦,如果这意味着以后您可以将 elem 查询为 map.at(key)map[key] 而不是创建一个空的 elem.

此外,std::set 还是(大致)在水下完成了整个关键的事情。 (来源:What is the difference between set vs map in C++?)

关于c++ - std::unordered_set::find - 仅为 find() 构造一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905284/

相关文章:

c++ - 检测 parking 场线和ROI openCV

c++ - 追加函数和 nullptr 不起作用

C++ 从文本文件中读取字典并将其存储在排序容器中的最佳方法是什么

c++ - Qt 与 STL 和 Boost 配合得好吗?

c++ - STL priority_queue<pair> 与 map

c++ - 使用 VerQueryValue 检索应用程序的文件描述

c++ - C++中运行时和编译时多态性之间的区别

C++ 位运算 : How to decode/decompress char to int, 并显示正确的字符串?

Android NDK 未定义对 google protobuf 的引用

c++ - 如果一个堆栈协程锁定一个互斥量然后让出怎么办?