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

如何修改可变参数模板定义的map的比较器(基于num字段)

基于num字段替换map比较器的实现方案

由于无法修改alpha和beta结构体的operator<,我们可以通过给std::map指定自定义比较器来实现按num字段排序,同时适配现有可变参数模板结构,具体实现如下:

1. 定义通用自定义比较器

实现一个通用比较器结构体,利用模板成员函数适配所有拥有num字段的类型:

struct CompareByNum {
    template<typename T>
    bool operator()(const T& lhs, const T& rhs) const {
        return lhs.num < rhs.num;
    }
};

2. 调整map的模板参数传递

在Label_map中,给std::map显式传入第三个模板参数(自定义比较器),覆盖默认的std::less<Key>:

struct Label_map
{
    label_str<std::map, alpha, beta, CompareByNum> al_beta_map;
};

完整修改后的代码

#include <string>
#include <map>
#include <iostream>

struct alpha{
    alpha() = default;
    alpha(std::string str, int i ) : mystr(str), num(i){}
    std::string mystr{"abc"};
    int num{0};
    bool operator <( const alpha &al ) const
    {
       return ( mystr < al.mystr );
    }
};
struct beta{
    beta() = default;
    beta(std::string str, int i ) : mystr(str), num(i){}
    std::string mystr{"abc"};
    int num{0};
    bool operator <( const beta &b1 ) const
    {
       return ( mystr < b1.mystr );
    }

};

// 自定义比较器:基于num字段排序
struct CompareByNum {
    template<typename T>
    bool operator()(const T& lhs, const T& rhs) const {
        return lhs.num < rhs.num;
    }
};

template<template<typename ...> class Tcont, typename... Titem>
struct label_str
{
    Tcont<Titem...> kindA;
};

struct Label_map
{
    // 给std::map传入自定义比较器作为第三个模板参数
    label_str<std::map, alpha, beta, CompareByNum> al_beta_map;
};

struct big_map
{
    Label_map first;
    Label_map second;
};

int main()
{
    auto a1 = alpha("a1", 1);
    auto a2 = alpha("a2", 2);
    auto a3 = alpha("a3", 3);
    auto a4 = alpha("a4", 4);
    auto a5 = alpha("a5", 5);

    auto b1 = beta("b1", 1);
    auto b2 = beta("b2", 2);
    auto b3 = beta("b3", 3);
    auto b4 = beta("b4", 4);
    auto b5 = beta("b5", 5);

    big_map bigg;

    auto &first_map = bigg.first;

    first_map.al_beta_map.kindA[a5] =  b5;
    first_map.al_beta_map.kindA[a2] =  b2;
    first_map.al_beta_map.kindA[a3] =  b3;
    first_map.al_beta_map.kindA[a4] =  b4;
    first_map.al_beta_map.kindA[a1] =  b1;
    
    auto &mmmap = first_map.al_beta_map.kindA;
    for ( auto [p,_] : mmmmap ) 
        std::cout << "( " << p.mystr << ", " << p.num << " )" << std::endl;
}

效果验证

运行代码后,map会按照alpha的num字段从小到大排序,输出结果为:

( a1, 1 )
( a2, 2 )
( a3, 3 )
( a4, 4 )
( a5, 5 )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:20:38