标准库中是否有可用于std::map的大小写不敏感字符串比较器?有无替代方案?
大小写不敏感std::map的替代实现方案
标准库中没有直接等价于自定义CaseInsensitiveCompare的内置组件,因为大小写转换规则高度依赖本地化设置,标准库并未提供通用的大小写不敏感字符串比较器。不过有几种无需额外定义结构体的方式来创建这类std::map:
使用Lambda表达式结合
decltype
直接定义比较逻辑的Lambda,再通过decltype获取其类型作为std::map的模板参数,示例代码如下:// 定义大小写不敏感的比较Lambda auto caseInsensitiveComp = [](const std::string& lhs, const std::string& rhs) { return std::lexicographical_compare( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [](char l, char r) { // 用当前locale处理大小写转换,也可替换为ASCII专属逻辑 return std::tolower(l, std::locale()) < std::tolower(r, std::locale()); } ); }; // 传入Lambda类型和实例创建map std::map<std::string, int, decltype(caseInsensitiveComp)> caseInsensitiveMap(caseInsensitiveComp);这种方式省去了结构体定义,直接在需要的地方生成比较逻辑,适合临时使用场景。
复用比较器类型(适配多次创建场景)
如果需要多次创建大小写不敏感的map,可以用using别名复用比较器类型,避免重复书写decltype:auto caseInsensitiveComp = [](const std::string& lhs, const std::string& rhs) { return std::lexicographical_compare( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [](char l, char r) { return std::tolower(l, std::locale()) < std::tolower(r, std::locale()); } ); }; // 定义别名简化后续创建 using CaseInsensitiveMap = std::map<std::string, int, decltype(caseInsensitiveComp)>; // 直接用别名创建实例,注意传入Lambda对象 CaseInsensitiveMap map1(caseInsensitiveComp); CaseInsensitiveMap map2(caseInsensitiveComp);
注意:如果仅需处理ASCII字符的大小写,可以将
std::tolower(l, std::locale())替换为std::tolower(static_cast<unsigned char>(l)),避免本地化带来的额外开销,同时规避char为负值时的未定义行为。
内容的提问来源于stack exchange,提问作者Haoshu
相关产品推荐
相关产品推荐

