📜  c++ 自定义比较集合 - C++ (1)

📅  最后修改于: 2023-12-03 15:14:01.617000             🧑  作者: Mango

C++ 自定义比较集合

在C++中,STL中有许多实用的集合容器,比如vector、list、map等等。这些容器的特点就是自动进行排序,并且提供了一些默认的比较函数。但是,在一些特殊场景下,我们可能需要自定义比较函数来满足我们的需求。

本文将介绍在C++中如何自定义比较集合。

自定义比较函数

在STL中,我们可以使用函数对象(function object)来代表一个可调用对象。在比较集合时,我们可以传入一个自定义的函数对象,用来实现特定的比较方式。

以vector为例,我们可以使用它的sort函数来进行排序,以下是一个自定义比较函数的示例:

bool cmp(int a, int b) {
    return a > b;
}

vector<int> vec{5, 2, 3, 1, 4};
sort(vec.begin(), vec.end(), cmp);

上述代码中的cmp函数返回a是否比b大,sort函数将按照这个规则排序。

自定义比较类

除了函数对象,我们还可以使用类来代表一个可调用对象。这个类需要定义一个重载了函数调用操作符(operator())的函数。

以下是一个自定义比较类的示例:

struct Node {
    int val;
    Node(int v): val(v) {}
};

struct NodeCmp {
    bool operator()(const Node& a, const Node& b) const {
        return a.val < b.val;
    }
};

set<Node, NodeCmp> s;

s.insert(Node(5));
s.insert(Node(2));
s.insert(Node(3));
s.insert(Node(1));
s.insert(Node(4));

上述代码中,我们定义了一个NodeCmp类,它实现了一个可调用的函数对象。这个类被用来将Node对象插入set中,set中的元素将按照NodeCmp中定义的比较方式进行排序。

总结

自定义比较函数或比较类的方法适用于许多STL容器,包括vector、list、map、set等等。通过自定义比较对象,我们可以对容器中的元素进行灵活的排序,满足特定的需求。