[英]Sort a vector of wstrings, but case insensitive
使用以下命令對wstring
的向量進行排序時:
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
但我不知道如何。
(由於我正在尋找一種有效的排序方式,能夠在短時間內對數百萬個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);
});
});
另外,您可能希望使用使用當前(全局) C
語言環境的towlower
來代替std::ctype<wchar_t>::tolower
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.