查找 std::set 中的键成对存储

Finding key in std::set by key stored in pair

本文关键字:存储 std set 查找      更新时间:2023-10-16

所以我对 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)
}

我能够在 map 对象中很好地实现所有内容,但后来我不得不切换到集合,因为我希望能够对数据结构中的项目进行排序,并且我被告知您无法在 map 中有效地执行此操作,因此有了集合。

std::set根据整个值存储和搜索值。 所以当你为pair(key, null)做一个find,并且集合包含pair(key, somevalue),它不会找到它,因为它们是不一样的。

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

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

set s 的map可以做你想做的事:

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

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

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

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。与排序一样,搜索将仅按字符串进行。按字符串和emptyObject搜索isSet函数将被忽略,可以是任何现有对象。在示例中,它是一个内部函数,一旦初始化静态对象。