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 小写的副本,并对第二个向量进行排序不是一个好主意?)
但没有任何成功,因为 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区域设置。