对字符串向量进行排序,但不区分大小写

Sort a vector of wstrings, but case insensitive

本文关键字:不区 大小写 排序 字符串 向量      更新时间:2023-10-16

当对wstrings 的向量进行排序时:

vector<wstring> v; 
v.push_back(L"zzz"); 
v.push_back(L"BBB"); 
v.push_back(L"aaa"); 
sort(v.begin(), v.end()); 

结果是BBB,aaa,zzz。如何使大小写不区分的排序?


我试过

sort(v.begin(), v.end(), 
[](wstring lhs, wstring rhs) { return tolower(lhs) < tolower(rhs); });

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

我可能不得不使用lexicographical_compare但我看不出如何。

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

但没有任何成功,因为 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);
});
});

或者,您可能希望使用使用当前(全局(C区域设置的towlower而不是std::ctype<wchar_t>::tolower