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

问题描述 投票:2回答:1

很多时候,我看到我的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()不浪费?我的意思是,这不会让我创建一个我不想要的实例

  • 对我来说真的很奇怪 - 我已经应该找到我正在寻找的元素,或者至少是它的空壳。
c++ c++11 stl set
1个回答
0
投票

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

如果你想从键中查找数据,你应该使用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++?

© www.soinside.com 2019 - 2024. All rights reserved.