要创建不区分大小写的
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
等同的东西?或者是否有其他方法可以定义不区分大小写的映射而不需要额外的结构?
不,没有。您的替代方案是您公开的或直接使用 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);
};
像这样使用原始字符串的包装器,只是重新实现不区分大小写。