簡體   English   中英

C ++:搜索指向類的std :: set指針

[英]C++: Searching a std::set of pointers to class

我問了一個與昨天類似的,措辭很差的(且收到的消息很差,哎呀),我有時間去思考和更好地解釋(並且在嘗試找出問題時也取得了一些進展),所以這里是:

我有一個State類和一個Node類。 Node包含一個指向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相同指針,將一個插入到set中,然后使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM