【问题标题】:C++: Searching a std::set of pointers to classC++:搜索一个 std::set 指向类的指针
【发布时间】:2015-09-16 19:06:48
【问题描述】:

我问了一个与昨天类似的问题,这个问题表述得相当糟糕(而且收到的结果也很糟糕,哎呀),我有时间思考并更好地解释(我在试图解决这个问题方面也取得了一些进展),所以这里是:

我有一个班级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 表示未找到)查找Statestates 中的 z 相同。这应该返回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 中),我最好的做法是什么?

【问题讨论】:

  • set 需要 &lt;(默认),而不是 ==
  • set 比较它的元素。如果它的元素是指针,那么它会比较指针,而不是指向的对象。
  • 您可能有指向两个等价的State 对象的指针,但您没有两个indentical 指针。

标签: c++ class pointers stl set


【解决方案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);
}

【讨论】:

  • 这是正确的,但无法解释当前问题的原因。
  • 这行得通,谢谢。我假设 std::set 是有序的,因此使用
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2012-04-19
相关资源
最近更新 更多