如何在C++ std::map中以结构体为键实现查找功能?
结构体作为std::map键的find函数使用说明
std::map的find函数完全支持用结构体作为键,只要你为map提供了符合严格弱序要求的比较器,你的代码已经走对了方向,但有两处细节需要修正:
find返回值的判断错误:
find返回的是迭代器,不能直接放在if里判断。正确的做法是将返回的迭代器与mymap.end()比较,当两者不相等时才说明找到了对应元素:if (mymap.find(x) != mymap.end()) { printf("found"); }比较器的参数优化:你的比较器里直接传TechId值会触发结构体拷贝,改成const引用可以提升效率,同时不影响逻辑:
struct our_cmp { bool operator() (const TechId& a, const TechId& b) const { return std::make_pair(a.a,a.b) > std::make_pair(b.a, b.b); } };
补充说明:std::map是有序容器,它依靠比较器来确定键的排序规则和等价性——当两个键既不满足cmp(a,b)也不满足cmp(b,a)时,它们会被视为等价键,find就能匹配到对应的元素。你的比较器用std::make_pair来比较两个结构体的成员,逻辑是成立的,因为pair的比较本身就符合严格弱序。
修正后的完整代码:
typedef struct { int a, b; } TechId; struct our_cmp { bool operator() (const TechId& a, const TechId& b) const { return std::make_pair(a.a,a.b) > std::make_pair(b.a, b.b); } }; int main() { std::map<TechId, int, our_cmp> mymap; // 示例:插入一个元素 TechId insert_id = {1, 2}; mymap[insert_id] = 100; // 查找元素 TechId x = {1, 2}; if (mymap.find(x) != mymap.end()) { printf("found"); } }
内容的提问来源于stack exchange,提问作者Atoptix
相关产品推荐
相关产品推荐

