gpt4 book ai didi

c++ - 如何用 std::set 包含我的类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:48 30 4
gpt4 key购买 nike

我正在尝试用 C++ 语言编写程序。

Class Edge表示u和v之间的连接。

表示u和v之间连接的边a。表示v和u之间连接的边a'。边 a 和 a' 表示相同的连接。所以,我想包含 a 或 a'。

我知道“set”存储独特的元素。所以我想用这个。我在下面定义了运算符<。

当我搜索错误时,我发现了一些麻烦。我存储 (1,2) -> (1,2) -> (2,1) -> (3,2) -> (2,3) -> (5,2)。

但设置商店

1 2
5 2
3 2
1 2 <-- Why ????

你能帮帮我吗??

#include<iostream>
#include<set>

class Edge {

private:
int u, v;

public:
bool operator< (const Edge& e) const {
bool result = true;
if( (u == e.u && v == e.v) || (v == e.u && u == e.v) ) {
result = false;
}
return result;
}

std::pair<int, int> pair() const {
return std::pair<int, int>(u, v);
}

Edge(int u_, int v_) : u(u_), v(v_) {}
};

int main(void) {
std::set<Edge> edge;
std::set<Edge>::iterator eit;

edge.insert(Edge(1,2)); // <-- (1,2) can be contained.
edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained.
edge.insert(Edge(2,1)); // <-- (2,2) doesn't have to be contained.

edge.insert(Edge(3,2)); // <-- (3,2) can be contained.
edge.insert(Edge(2,3)); // <-- (2,3) doesn't have to be contained.
edge.insert(Edge(5,2)); // <-- (5,2) doesn't have to be contained.

edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained. But edge contains this. Why?

for(eit = edge.begin(); eit != edge.end(); eit++) {

std::cout << (*eit).pair().first << " " << (*eit).pair().second << std::endl;
}

return 0;
}

最佳答案

你的 operator<正在测试是否相等,不少于。尝试:

if (u < e.u)
result = true;
else if (e.u < u)
result = false;
else
result = (v < e.v);

编辑:根据评论,我误解了这个问题 - 该集合应该以任一顺序拒绝重复项。比较运算符需要保持一致,所以这里有一个可能有效。

if (min(u,v) < min(e.u,e.v))
result = true;
else if (min(e.u,e.v) < min(u,v))
result = false;
else
result = (max(u,v) < max(e.u,e.v));

关于c++ - 如何用 std::set 包含我的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530042/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com