【问题标题】:Finding key in std::set by key stored in pair通过存储在对中的密钥在 std::set 中查找密钥
【发布时间】:2016-03-06 05:00:06
【问题描述】:

所以我对 c++ 还很陌生,我对如何在存储 pair 项目的集合上实现 find() 函数有点困惑。我已经阅读了如何按对插入和删除项目,但对任何人解释如何使用find(或其他方法,如果有的话)通过对的第一个项目查找值的人来说都是干巴巴的。

set<pair<string, CustomObject>> *items = new set<pair<string, CustomObject>>();

然后假设我在集合中插入了几对,然后我想通过搜索存储为该对中第一项的“密钥”来找到其中一对。我认为这将涉及在这对上调用.first,但我只是遇到了麻烦。这是我试图实现的基本功能

bool inSet(string key){
    return this->items->find(pair<string, CustomObject>(key, null).first)
}

我能够在地图对象中很好地实现所有内容,但后来我不得不切换到一个集合,因为我希望能够对数据结构中的项目进行排序,但有人告诉我你不能在一个地图,因此是集合。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/9843278/…
  • 你应该使用 map 而不是 set。
  • (1) new 是不必要的。根本不使用指针。 (2) 您似乎想要std::mapstd::unordered_map,而不是std::set。 (3) 无论如何,请注意std:.set 通常会做很多工作,以便为您提供有序的项目序列,而您通常不需要这些,因此默认情况下,如果需要通用集合,请使用unordered_set.
  • @Mox 和@Cheers,我可以使用地图,但如何根据其价值对其进行排序? map&lt;string, CustomObject &gt; *items = new map&lt;string, CustomObject &gt;();。这就是最初把我带到这里的问题
  • map 中的所有内容在插入过程中都会进行排序。地图本质上是平衡的二叉搜索树,用于动态排序。

标签: c++ sorting dictionary set


【解决方案1】:

std::set 根据整个 值存储和搜索值。因此,当您为pair(key, null) 执行find,并且该集合包含pair(key, somevalue) 时,它不会找到它,因为它们不一样。

如果您只想通过关键字进行搜索,则需要std::map。正如您所说,这不会按值进行任何搜索或排序,因此您只能有一个带有给定key 的条目。

如果您只想按键和键、值对搜索/排序(在同一数据结构的生命周期的不同点进行不同的搜索),那么您将需要更复杂的安排。

sets 中的 map 可以做你想做的事:

std::map<string, std::set<CustomObject>> items;

现在,当您只想通过键查找内容时,您只需在地图中查找,并使用该键返回一组所有值。如果您想进一步搜索特定值,请在该集​​合中查找。

【讨论】:

  • 这可能是解决我遇到的整体问题的方法(我简化了我的问题以试图获得答案)。这会起作用,但有没有一种快速的方法来对这张地图进行排序?假设每个CustomObject 都有一个int 值,我想通过CustomObject 集合的int 值的总和对地图进行排序?我猜是某种自定义迭代器?
  • 根据需要重新定义排序谓词,看我的回答
  • 排序过程中不能访问map的值
  • @Jordan:“对地图进行排序”是什么意思?地图已经根据键排序。任何给定的地图或集合只能对一件事进行排序,由地图或集合的声明定义。如果你想要一个未排序的数据结构,并且可以在不同的时间对不同的事物进行排序,你可以使用std::vector
  • std::vector 并考虑std::list 以在排序时简化大对象的内存重新分配。需要说的是vector的两种使用方式。第一个用于集合iteslf,第二个用于排序键。
【解决方案2】:

要通过成对存储的键在 std::set 中查找键,您需要为您的集合重新定义顺序比较过程(如果您需要多个对象,请使用多重集合):

typedef pair<string, CustomObject> SetValue

struct CustomObjectCompare {
    bool operator() (const SetValue& lhs, const SetValue& rhs) const{
        return rhs.first < rhs.first;
    }
};

// use multiset insead of set if you need multiple objects per one key
typedef set<pair<string, CustomObject>, CustomObjectCompare> Set;

Set mySet;

bool inSet(string key){
    static CustomObject emptyObject;
    return mySet.end() != mySet.find(SetValue(key, emptyObject))
}

此示例使用该比较对象定义比较对象CustomObjectCompare 和特殊集合类Set。由于搜索排序将仅按字符串。函数isSet 按字符串搜索和emptyObject 被忽略,可能是任何已存在的对象。例如,它是一个内部函数,一旦初始化静态对象。

【讨论】:

  • 本质上是把set变成map——你不能在集合中放置两对具有相同字符串(和不同对象)。
  • 不相等。 (1)比较时无法访问map的值。 (2)一般情况下set in not equal to map的实现。 (3)当作者每个键需要多个值时,只需使用multiset而不是set。 (4)它也是通过一个循环而不是两个循环来简化枚举集合。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多