微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在集合中存储相等的对象

如何解决在集合中存储相等的对象

我想要做的是:按 setelem->value 中的元素进行排序,但仍然根据它们指向的内存地址认识到它们是不同的元素。

#include <iostream>
#include <set>

using namespace std;

struct Node {
    int value;
    
    Node(int v) : value(v) {}
};

int main()
{
    Node* a = new Node(10);
    Node* b = new Node(10);
    Node* c = new Node(20);

    if (a == b) {
        cout << "a == b" << endl;
    }
    
    if (a == c) {
        cout << "a == c" << endl;
    }
    
    auto comparator = [](Node* lhs,Node* rhs) {
        return lhs->value < rhs->value;
    };

    set<Node*,decltype(comparator)> s(comparator);
    s.insert(a);
    s.insert(b);
    s.insert(c);
    
    cout << "after inserts,s.size() = " << s.size() << endl;
    
    s.erase(a);
    
    cout << "after erase,s.size() = " << s.size() << endl;
    
    delete(a);
    delete(b);
    delete(c);

    return 0;
}

a != b 起,我希望得到:

after inserts,s.size() = 3
after erase,s.size() = 2

但相反,我得到:

after inserts,s.size() = 2
after erase,s.size() = 1

使用 lhs->value <= rhs->value,我得到:

after inserts,s.size() = 3

使用 multiset,我得到:

after inserts,s.size() = 1

解决方法

您应该使用内存地址进行决胜局。

示例:

auto comparator = [](Node* lhs,Node* rhs) {
    return lhs->value < rhs->value ||
        (lhs->value == rhs->value && lhs < rhs);
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。