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

问题描述 投票:0回答:1

要创建不区分大小写的

std::map
键的
string
,我们可以定义一个
struct CaseInsensitiveCompare
,并在定义
Compare
时将其作为
map
模板传递。

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 CaseInsensitiveCompare
std
中是否有与
struct CaseInsensitiveCompare
等同的东西?或者是否有其他方法可以定义不区分大小写的映射而不需要额外的结构?

c++ stl std
1个回答
0
投票

不,没有。您的替代方案是您公开的或直接使用 CaseInsensitiveString。

也许你可以为不区分大小写的字符串做一个包装:

template <class BaseStringType>
class CIString : public BaseStringType {
public:
   friend std::strong_ordering operator<=>(CIString const & lhs, CIString const & rhs);
   friend bool operator==(CIString const & lhs, CIString const & rhs);
};

像这样使用原始字符串的包装器,只是重新实现不区分大小写。

© www.soinside.com 2019 - 2024. All rights reserved.