我正在阅读,并且在下面的运算符重载部分感到困惑, 在这里,我们如何在不定义比较器的情况下进行排序。
如何在不定义任何比较器的情况下对两种结构进行排序,编译器如何知道它在什么基础上进行两种排序?
当我们要使用e1的时候
假定使用类似以下内容的STL排序的默认比较器 e1bool运算符<(Edge const&other)在结构内。
struct Edge {
int u, v, weight;
bool operator<(Edge const& other) {
return weight < other.weight;
}
};
vector<Edge> edges;
sort(edges.begin(), edges.end());
答案 0 :(得分:0)
默认情况下,std::sort()
使用operator<()
作为比较器。这就是为什么排序适用于您的Edge
结构的原因。
如果您希望执行自定义排序,或者您的结构/类不提供operator<()
,则需要将比较器函数对象传递给std::sort()
。例如,如果我们更改您的Edge
结构以删除operator<()
...
struct Edge {
int u, v, weight;
};
void print_edges(const std::vector<Edge> &edges)
{
for (Edge const &e : edges)
{
std::cout << e.weight << std::endl;
}
}
int main()
{
std::vector<Edge> edges { {4, 5, 9}, {1, 2, 3} };
std::cout << "Unsorted:\n";
print_edges(edges);
std::sort(edges.begin(), edges.end(), [](Edge const &lhs, Edge const &rhs){
return lhs.weight < rhs.weight;
});
std::cout << "Sorted:\n";
print_edges(edges);
return 0;
}