通过成对存储的密钥查找 std::set 中的密钥
Finding key in std::set by key stored in pair
所以我对 c++ 还很陌生,我对如何在存储 pair
项的集合上实现 find()
函数有些困惑。我阅读了如何按对插入和删除项目,但对解释如何使用 find
(或其他方法,如果有的话)的任何人都感到厌烦,以找到对中第一个项目的值。
set<pair<string, CustomObject>> *items = new set<pair<string, CustomObject>>();
然后假设我在集合中插入了几对,然后我想通过搜索存储为该对中第一项的 "key" 来找到其中一对。我认为这将涉及调用 .first
对,但我只是遇到了麻烦。这是我试图实现的基本功能
bool inSet(string key){
return this->items->find(pair<string, CustomObject>(key, null).first)
}
我能够在地图对象中很好地实现所有内容,但后来我不得不切换到集合,因为我希望能够对数据结构中的项目进行排序,但有人告诉我你不能有效地做到这一点在地图中,因此是集合。
std::set
存储和搜索基于 整个 值的值。因此,当您为 pair(key, null)
执行 find
并且集合包含 pair(key, somevalue)
时,它不会找到它,因为它们不相同。
如果您只想通过关键字进行搜索,则需要 std::map
。正如您所说,这不会按值进行任何搜索或排序,因此您只能有一个具有给定 key
.
的条目
如果您只想通过键和键、值对(同一数据结构生命周期中不同点的不同搜索)search/sort,那么您将需要更复杂的安排.
map
的 set
可以做你想做的事:
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
和特殊集合 class Set
以及该比较对象。由于搜索和排序将仅按字符串进行。函数 isSet
按字符串搜索和 emptyObject
被忽略,可能是任何已存在的对象。在示例中,它是一个函数内部一次初始化静态对象。
所以我对 c++ 还很陌生,我对如何在存储 pair
项的集合上实现 find()
函数有些困惑。我阅读了如何按对插入和删除项目,但对解释如何使用 find
(或其他方法,如果有的话)的任何人都感到厌烦,以找到对中第一个项目的值。
set<pair<string, CustomObject>> *items = new set<pair<string, CustomObject>>();
然后假设我在集合中插入了几对,然后我想通过搜索存储为该对中第一项的 "key" 来找到其中一对。我认为这将涉及调用 .first
对,但我只是遇到了麻烦。这是我试图实现的基本功能
bool inSet(string key){
return this->items->find(pair<string, CustomObject>(key, null).first)
}
我能够在地图对象中很好地实现所有内容,但后来我不得不切换到集合,因为我希望能够对数据结构中的项目进行排序,但有人告诉我你不能有效地做到这一点在地图中,因此是集合。
std::set
存储和搜索基于 整个 值的值。因此,当您为 pair(key, null)
执行 find
并且集合包含 pair(key, somevalue)
时,它不会找到它,因为它们不相同。
如果您只想通过关键字进行搜索,则需要 std::map
。正如您所说,这不会按值进行任何搜索或排序,因此您只能有一个具有给定 key
.
如果您只想通过键和键、值对(同一数据结构生命周期中不同点的不同搜索)search/sort,那么您将需要更复杂的安排.
map
的 set
可以做你想做的事:
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
和特殊集合 class Set
以及该比较对象。由于搜索和排序将仅按字符串进行。函数 isSet
按字符串搜索和 emptyObject
被忽略,可能是任何已存在的对象。在示例中,它是一个函数内部一次初始化静态对象。