std 中是否有类/结构可以不区分大小写地比较字符串,并且可以用作 std::map 中的 Compare 模板?

Is there a class/struct in std that compares strings case insensitively and can be used as the Compare template in std::map?

提问人:Haoshu 提问时间:10/11/2022 更新时间:10/11/2022 访问量:77

问:

要创建一个不区分大小写的键,我们可以定义一个 ,并在定义 .std::mapstringstruct CaseInsensitiveCompareComparemap

template<class T>
struct CaseInsensitiveCompare
{
    bool operator() (const T& l, const T& r) const
    {
        return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end(), [](auto l, auto r) { return std::tolower(l, std::locale()) < std::tolower(r, std::locale()); });
    }
};

std::map<std::string, int, CaseInsensitiveCompare<std::string>> caseInsensitiveMap;

但是,每当我们需要不区分大小写的映射时,我们都需要定义一个。有什么东西是等价的吗?或者有没有其他方法可以在没有额外结构的情况下定义不区分大小写的映射?struct CaseInsensitiveComparestdstruct CaseInsensitiveCompare

C++ STL 标准

评论

2赞 Sam Varshavchik 10/11/2022
简短的回答是:不。长期以来,C++中有用且方便的语言环境支持一直是一个痛点。
2赞 Eljay 10/11/2022
不区分大小写是很困难的,因为这完全取决于编码。不敏感的 EBCDIC 代码页 37 将与不敏感的 ISO 8859-1 完全不同,后者将不同于 CCSID 1276(Adobe PostScript 标准编码),后者将不同于 Unicode。对区域设置和编码的支持不是 C++ 的优势之一。
0赞 Jarod42 10/11/2022
自定义char_trait可能是一种替代方法,请参阅 gotw.ca/gotw/029.htm

答: 暂无答案