对 wstrings 向量进行排序,但不区分大小写

Bas*_*asj 2 c++ sorting string vector

对 s的向量进行排序时wstring

vector<wstring> v; 
v.push_back(L"zzz"); 
v.push_back(L"BBB"); 
v.push_back(L"aaa"); 
sort(v.begin(), v.end()); 
Run Code Online (Sandbox Code Playgroud)

结果是 BBB、aaa、zzz。如何进行不区分大小写的排序?


我尝试过

sort(v.begin(), v.end(), 
       [](wstring lhs, wstring rhs) { return tolower(lhs) < tolower(rhs); });
Run Code Online (Sandbox Code Playgroud)

但没有任何成功,因为tolower仅适用于 char / wchar_t,而不适用于 wstring。

我可能必须使用lexicographical_compare,但我不知道如何使用。

(因为我正在寻找一种有效的排序,能够在短时间内对数百万个 wstring 进行排序,所以我认为临时存储所有 wstring 小写的副本,并对第二个向量进行排序不是一个好主意?)

Max*_*kin 5

但没有任何成功,因为 tolower 仅适用于 char / wchar_t。

你要std::ctype<wchar_t>::tolower

auto& f = use_facet<ctype<wchar_t>>(locale());
sort(v.begin(), v.end(), [&f](wstring const& a, wstring const& b) {
    return lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [&f](wchar_t ai, wchar_t bi) {
        return f.tolower(ai) < f.tolower(bi);
    });
});
Run Code Online (Sandbox Code Playgroud)

或者,std::ctype<wchar_t>::tolower您可能喜欢使用towlower当前(全局)C区域设置。