搜索指向类的std::指针集

C++: Searching a std::set of pointers to class

本文关键字:指针 std 搜索      更新时间:2023-10-16

昨天我问了一个类似的问题,我有时间思考和更好地解释(我也在试图找出问题的过程中取得了一些进展),所以是这样的:

有一个类State和一个类NodeNode包含一个指向State的指针作为成员:

class State{
public:
    int a;
    int b;
    State(int a1, int b1){
        a = a1;
        b = b1;
    }
};
class Node{
public:
    State *s;
    Node(State *s1){
        s = s1;
    }
    Node(){
        s = NULL;
    }
};
int main() {
    State *s = new State(5, 6);
    State *z = new State(5, 6);
    Node *n = new Node(s);
    set<State*> states;
    states.insert(s);
    cout<<states.count(z);
    return 0;
}

你可以在main中看到,我创建了两个指向State的相同指针,将一个插入到集合中,然后使用state::count(找到返回1,未找到返回0)在states中查找与z相同的State。这个应该返回1,但它返回0。起初我认为这是因为我需要重载States之间的比较器,但即使在编写了这个函数之后:

bool operator==(const State &s1, const State &s2){
    if(s1.a == s2.a && s1.b == s2.b)
        return true;
    else
        return false;
}

返回0。我的下一个想法是,因为这是一组指向State的指针,而不是实际的对象,因为我的==重载被绕过了。所以我试着这样做:

int main() {
    State *s = new State(5, 6);
    State *z = new State(5, 6);
    Node *n = new Node(s);
    set<State> states;
    states.insert(*s);
    cout<<states.count(*z);
    return 0;
}

这里有一个运行的例子:http://ideone.com/iYQyBK

我的想法是有一组State而不是指向State的指针,然后对指针进行解引用,但不幸的是,这个新代码给了我各种丑陋的编译错误,这些错误非常模糊,似乎与比较期间的失败有关,但我真的不能告诉他们是什么意思。我最好的举动是什么让set::count正常工作(或找到其他方法来检查State是否在我的set中)?

std::set要求严格排序:

bool operator<(const State &lhs, const State &rhs){
    return std::tie(lhs.a, lhs.b) < std::tie(rhs.a, rhs.b);
}

int main() {
    State s(5, 6);
    State z(5, 6);
    Node n(&s);
    std::set<State> states;
    states.insert(s);
    std::cout << states.count(z);
}