set::find 查找不存在的元素
set::find finds an element that does not exist
我有以下Edge
类:
class Edge {
public:
int src, dest;
bool operator== (const Edge &edge) const {
return ((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src));
}
bool operator<(const Edge& edge) const {
return !(((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src)));
}
Edge(int src, int dest) {
this->src = src;
this->dest = dest;
}
};
覆盖<
运算符的要点是当我尝试在应等于Edge(1, 0)
的集合中find
边Edge(0, 1)
。但是,以下测试代码无法执行此操作,std::find
返回甚至不存在的边缘:
Edge edge(0, 3);
set<Edge> test;
test.insert(Edge(3, 1));
test.insert(Edge(3, 0));
auto a = test.find(edge);
cout << a->src << " " << a->dest << endl;
这将奇怪地打印出2 0
.我不知道为什么,我是新手C++任何帮助都是值得赞赏的。
您当前没有有效的Compareforstd::set
,因此您的程序具有未定义的行为。
这是一个与您的==
兼容的
bool operator<(const Edge& edge) const {
return std::minmax(src, dest) < std::minmax(edge.src, edge.dest);
}
这也可用于简化您的==
bool operator==(const Edge& edge) const {
return std::minmax(src, dest) == std::minmax(edge.src, edge.dest);
}
代码中有两个问题。
首先,不要检查test.find()
是否返回有效的边;请注意,如果未找到元素,find
返回end()
。
其次,您的<
运算符没有实现严格的排序,它实际上只是定义了一个!=
。为了克服这个问题,我会规范化每个边,以便始终将下部节点视为起点;然后根据起始节点做出决定,并且仅当它们相等时,才考虑目标节点:
class Edge {
public:
int src, dest;
bool operator== (const Edge &edge) const {
return ((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src));
}
bool operator<(const Edge& edge) const {
// return !(((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src)));
int thisSrc = std::min(src,dest);
int thisDest = std::max(src,dest);
int eSrc = std::min(edge.src,edge.dest);
int eDest = std::max(edge.src,edge.dest);
if (thisSrc < eSrc) {
return true;
} else if (thisSrc > eSrc) {
return false;
} else {
return thisDest < eDest;
}
}
Edge(int src, int dest) {
this->src = src;
this->dest = dest;
}
};
#include <set>
int main() {
Edge edge(0, 3);
std::set<Edge> test;
test.insert(Edge(3, 1));
test.insert(Edge(3, 0));
auto a = test.find(edge);
if (a == test.end()) {
std::cout << "edge not found." << std::endl;
} else {
std::cout << a->src << " " << a->dest << std::endl;
}
}
输出:
3 0
相关文章:
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- g++ 说函数不存在,即使包含正确的标头
- 更新的矢量元素不打印
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 查找第一个数组中不存在的元素
- 查找不存在的键时,unordered_map返回什么
- 转置矩阵:交换元素不会更改值
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- set::find 查找不存在的元素
- 如果键不存在,使用 [] 运算符访问 STL Map 元素会添加新元素
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- 如果路径的每个元素不存在,请为其创建一个目录
- 在C++中传递结构数组 - 被调用函数中不存在结构元素,如何正确传递向量?
- clang以 - 所有的标志在矢量中没有不存在的元素
- 有效地测试 QSet 是否包含元素,如果不存在,则插入
- 为什么 STL 向量的迭代器可以指向不存在的元素?
- 使用0来显示不存在元素的集合的子集
- 获取受不存在元素限制的QSet子集