所以我对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)
}
我能够在地图对象中实现一切正常,但后来我不得不切换到一个集合,因为我希望能够对数据结构中的项目进行排序,并且我被告知您无法有效地执行此操作地图,因此集合。
答案 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
将被忽略,并且可能是任何现有对象。在示例中,一旦初始化静态对象,它就是一个内部函数。