利用lambda实现set的自定义排序准则的局限

本文探讨了C++中lambda函数在字符串比较中的使用,通过实例展示了其局限性,并提供了一个简单的代码片段。输出结果揭示了lambda作为比较函数在集合操作中的应用。

在这里插入图片描述
在这里插入图片描述
lambad的局限就是上面两个图片所示,再增加一个自己的例子,相对简单:

#include <string>
#include <iostream>
#include <set>
#include <typeinfo>

using namespace std;

int main()
{
    auto cmp = [](const string& s1, const string& s2) {
        return s1[0] < s2[0];
    };
    set<string, decltype(cmp)> s(cmp);
    s.insert({"as", "bs", "AA"});

    for (auto& itr : s) {
        cout << itr << endl;
    }
}

输出:
在这里插入图片描述

在 Python 中,如果不使用 `lambda` 函数,仍然可以通过定义普通函数或类来实现自定义排序逻辑。`sort()` 方法和 `sorted()` 函数的 `key` 参数不仅接受 `lambda` 表达式,也接受任何可调用对象(如函数、类的方法等),因此可以通过定义一个命名函数或类来替代 `lambda` 实现自定义排序。 ### 使用普通函数作为 `key` 参数 可以定义一个普通的函数,该函数接受一个参数并返回用于排序的依据。例如,若要根据字符串长度进行排序,可以定义如下函数: ```python def get_length(s): return len(s) words = ["banana", "apple", "cherry", "date"] sorted_words = sorted(words, key=get_length) print(sorted_words) # 输出: ['date', 'apple', 'cherry', 'banana'] ``` 上述代码中,`get_length` 函数被用作 `key` 参数,它返回字符串的长度,从而实现了基于长度的排序[^1]。 ### 使用类定义复杂的排序逻辑 对于更复杂的排序需求,例如先按字符串长度排序,再按字母顺序排序,可以通过定义一个类并在其中实现 `__lt__` 方法来实现: ```python class Cmp: def __init__(self, value): self.value = value def __lt__(self, other): if len(self.value) == len(other.value): return self.value < other.value return len(self.value) < len(other.value) words = ["banana", "apple", "cherry", "date"] sorted_words = sorted(words, key=lambda x: Cmp(x)) print(sorted_words) # 输出: ['date', 'apple', 'cherry', 'banana'] ``` 在这个例子中,`Cmp` 类重写了 `__lt__` 方法,使得排序可以首先基于字符串长度,若长度相同则基于字母顺序[^4]。 ### 使用 `functools.cmp_to_key` 进行比较函数转换 如果希望使用传统的比较函数(即返回 -1、0、1 的函数),可以使用 `functools.cmp_to_key` 将其转换为适用于 `key` 参数的函数: ```python from functools import cmp_to_key def compare(a, b): if len(a) < len(b): return -1 elif len(a) > len(b): return 1 else: return -1 if a < b else (1 if a > b else 0) words = ["banana", "apple", "cherry", "date"] sorted_words = sorted(words, key=cmp_to_key(compare)) print(sorted_words) # 输出: ['date', 'apple', 'cherry', 'banana'] ``` 此方法允许实现更复杂的比较逻辑,但通常效率低于使用 `key` 函数的方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值