[英]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.