通过存储在pair中的键查找std :: set中的键

时间:2016-03-05 19:26:44

标签: c++ sorting dictionary set

所以我对c ++相当新,我对如何在我的集合上实现存储find()项目的pair函数感到有些困惑。我已经阅读过关于如何插入和删除项目的项目,但是对于解释如何使用find(或其他一些方法,如果有的话)来解释如何通过对中的第一项找到值的任何人来说都是干涩的。

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

然后让我说我插入几对,然后我想通过搜索&#34;键&#34;找到其中一对。被存储为该对中的第一项。我认为这将涉及调用.first对,但我只是遇到麻烦。这是我试图实现的基本功能

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

现在,当您只想按键查找内容时,只需在地图中查找,即可使用该键获取所有值的集合。如果您想进一步搜索特定值,请在该集​​中查找。

答案 1 :(得分:0)

要通过存储在对中的键查找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将被忽略,并且可能是任何现有对象。在示例中,一旦初始化静态对象,它就是一个内部函数。