如何修改可变参数模板定义的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
相关产品推荐
相关产品推荐

