C ++:搜索std ::指向类

时间:2015-09-16 19:06:48

标签: c++ class pointers stl set

我问了一个相当糟糕的(并且收到的,收到的,收到的,哎呀)问题,这个问题与我昨天有类似的问题,我有时间思考和更好地解释(我在尝试找出问题方面也取得了一些进展) ),所以这里:

我有一个班级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 (未找到)在State中查找与z相同的states。这应该返回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中?

1 个答案:

答案 0 :(得分:1)

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);
}