查找 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>>();
然后假设我在集合中插入了几对,然后我想通过搜索存储为对中第一项的"密钥"来找到其中一对。我认为这将涉及打电话给这对.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
函数将被忽略,可以是任何现有对象。在示例中,它是一个内部函数,一旦初始化静态对象。
- std::原子加载和存储都需要吗
- 如何从存储在std::映射中的std::集中删除元素
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 如何访问存储在 std::variant 中的类的方法
- std::vector move 而不是交换到空 vector 并释放存储
- 将可变参数模板类存储到 std::vector 中
- 在 std::vector<无符号字符中存储任意数据的方法>
- 存储 std::list 元素的地址;内存
- 在 C++11 智能指针中存储 std::thread
- 存储 std::p romise<R&>:"通信对象"
- 如果类型需要模板,如何存储std ::向量
- 在“std::map”中插入一个“int”值,该值应该存储“std::string”
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 为什么 libstdc++ 以相反的顺序存储 std::tuple 元素
- 模板化存储std::vector中的多种不同类型
- 存储 std::shared_ptr 的向量,<Foo>其中 Foo 是一个模板化类