You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在std::set/std::map中同时使用std::less<>转发特性与自定义比较器?

实现方案

你需要的大小写敏感透明比较器实现如下,仅需额外定义该比较器结构体即可:

struct case_less {
    // 启用透明比较特性,允许不同类型参数直接比较
    using is_transparent = void;

    // 两个Str对象的大小写敏感比较
    bool operator()(const Str& a, const Str& b) const {
        return static_cast<const std::string&>(a) < static_cast<const std::string&>(b);
    }

    // Str与const char*的大小写敏感比较,无临时对象生成
    bool operator()(const Str& a, const char* b) const {
        return a.compare(b) < 0;
    }

    // const char*与Str的大小写敏感比较,无临时对象生成
    bool operator()(const char* a, const Str& b) const {
        return b.compare(a) > 0;
    }
};

之后就可以按照需求直接声明两种规则的set:

std::set<Str,std::less<>> list_no_case; // 大小写不敏感,沿用你已实现的Str::operator<逻辑
std::set<Str,case_less> list_case; // 大小写敏感,支持透明参数转发无临时对象开销

原理解释

C++14版本之后为关联容器引入了透明比较特性:只要比较器定义了is_transparent类型标记,容器的find、count这类查找接口就会直接转发传入的任意类型参数,不会强制转换为容器元素类型,自然就不会生成临时对象。
你之前用的std::less<>就是标准库提供的默认透明比较器,它会直接调用元素类型的operator<,刚好匹配你Str类内置的大小写不敏感比较逻辑。我们自定义的case_less只是手动实现了大小写敏感的多参数比较重载,同时加上is_transparent标记,就获得了和std::less<>一样的透明转发能力。


内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 20:54:00