运算符在cpp中的结构中重载

时间:2019-03-08 09:33:55

标签: c++ operator-overloading

我正在阅读,并且在下面的运算符重载部分感到困惑, 在这里,我们如何在不定义比较器的情况下进行排序。

如何在不定义任何比较器的情况下对两种结构进行排序,编译器如何知道它在什么基础上进行两种排序?

当我们要使用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());

1 个答案:

答案 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;
}