You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序统计multiset中匹配姓名的Person数量始终返回0如何解决

问题原因

你的问题根源是multiset的比较逻辑和存储类型不匹配:

  • 你定义的multiset存储的是Person*指针类型,默认使用的less<Person*>比较器只会比较指针的内存地址值,不会比较指针指向的Person对象内容
  • 你虽然为Person类重载了operator<和operator==,但这两个运算符针对的是Person对象本身,对指针比较完全不生效
  • 你用来检索的sPerson是栈上临时对象的地址,和multiset里存储的堆上Person对象的地址必然不同,所以count始终返回0
修复方案

方案1:修改multiset存储实体对象(推荐,代码改动最小)

直接将multiset的存储类型改为Person而非指针,即可直接复用你写好的Person比较逻辑:

// 把原来的定义替换成
multiset<Person> persSet;
multiset<Person>::iterator iter;

对应插入元素时不要插指针,直接插对象:

persSet.insert(Person("KuangThu", "Bruce", 4157300));
// 其余插入逻辑同理修改,原来的new Person可以全部删掉,避免内存泄漏

检索时直接传searchPerson对象即可:

int cntPersons = persSet.count(searchPerson);
iter = persSet.lower_bound(searchPerson);

方案2:保留指针存储,自定义比较器

如果必须存储指针,需要自己实现针对Person*的比较器,比较指针指向的对象内容:

struct PersonPtrCompare {
    bool operator()(const Person* a, const Person* b) const {
        return *a < *b;
    }
};
// multiset定义改为
multiset<Person*, PersonPtrCompare> persSet;
multiset<Person*, PersonPtrCompare>::iterator iter;

修改后即可正常用sPerson指针检索匹配的内容。

额外注意

你当前代码中所有new出来的Person对象都没有调用delete释放,存在内存泄漏问题,实验代码也建议补充释放逻辑或者改用栈对象存储避免问题。

内容的提问来源于stack exchange,提问作者Angel Armendariz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:04