📅  最后修改于: 2023-12-03 15:14:01.617000             🧑  作者: Mango
在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等等。通过自定义比较对象,我们可以对容器中的元素进行灵活的排序,满足特定的需求。