在C++中,使用std::sort自定义排序函数时,可以通过传递比较函数或函数对象来控制元素的排序规则。以下是具体实现方法:

自定义比较函数

定义一个返回布尔值的函数,用于比较两个元素。当返回true时,第一个参数应排在第二个参数之前。

bool customCompare(int a, int b) {
    return a > b; // 降序排列
}

// 使用示例
std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), customCompare);

Lambda表达式

直接传递Lambda表达式作为比较函数,适合简单逻辑。

std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
    return a < b; // 升序排列
});

函数对象(Functor)

通过重载operator()的类实现,适用于需要状态的比较逻辑。

struct CustomComparator {
    bool operator()(int a, int b) const {
        return a % 2 > b % 2; // 奇数在前,偶数在后
    }
};

// 使用示例
std::vector<int> vec = {3, 1, 4, 2, 5};
std::sort(vec.begin(), vec.end(), CustomComparator());

注意事项

  • 严格弱序:比较函数必须满足严格弱序规则,即:
    • 不可反自反:comp(a, a)必须为false
    • 可传递性:若comp(a, b)comp(b, c)true,则comp(a, c)必须为true
    • 对称性:若comp(a, b)true,则comp(b, a)必须为false
  • 性能:Lambda和函数对象通常比普通函数更高效,因编译器可能内联优化。

示例:结构体排序

对自定义类型的排序需明确比较规则。

struct Person {
    std::string name;
    int age;
};

// 按年龄升序
std::vector<Person> people = {{"Alice", 25}, {"Bob", 20}};
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
    return a.age < b.age;
});

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐