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
相关产品推荐
相关产品推荐

