C++:搜索 std::set 个指向 class 的指针
C++: Searching a std::set of pointers to class
我昨天问了一个与此类似的问题,这个问题的表述相当糟糕(并且收到的反应很差,哎呀),我有时间思考并更好地解释(而且我在试图找出问题方面也取得了一些进展),所以这里是:
我有一个classState
和一个classNode
。 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
的相同指针,将一个指针插入集合中,然后使用 state::count
(returns 1 表示找到,0 表示未找到)在 states
中寻找与 z
相同的 State
。这应该 return 1,但它 returns 0。我起初认为这是因为我需要在 States
之间重载比较器,但即使在编写此函数之后:
bool operator==(const State &s1, const State &s2){
if(s1.a == s2.a && s1.b == s2.b)
return true;
else
return false;
}
我 returning 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);
}
我昨天问了一个与此类似的问题,这个问题的表述相当糟糕(并且收到的反应很差,哎呀),我有时间思考并更好地解释(而且我在试图找出问题方面也取得了一些进展),所以这里是:
我有一个classState
和一个classNode
。 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
的相同指针,将一个指针插入集合中,然后使用 state::count
(returns 1 表示找到,0 表示未找到)在 states
中寻找与 z
相同的 State
。这应该 return 1,但它 returns 0。我起初认为这是因为我需要在 States
之间重载比较器,但即使在编写此函数之后:
bool operator==(const State &s1, const State &s2){
if(s1.a == s2.a && s1.b == s2.b)
return true;
else
return false;
}
我 returning 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);
}