c++ - 对 wstrings vector 进行排序,但不区分大小写

标签 c++ string sorting vector

wstring vector 进行排序时:

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 小写的拷贝,并对第二个 vector 进行排序并不是一个好的选择想法?)

最佳答案

but without any success because tolower works only 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);
    });
});

或者,代替 std::ctype<wchar_t>::tolower您可能喜欢使用 towlower 使用当前(全局)C语言环境。

关于c++ - 对 wstrings vector 进行排序,但不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45490542/

相关文章:

c++ - 使用 LLVM 在 JXcore 中可用的 Node 插件

performance - 交换和转移有什么区别?

c++ - 如何在动态添加的按钮中连接 Qt 信号和插槽以获取添加按钮的插槽索引?

c++ - 官方 ld 链接器规范

c++ - 类成员初始化的最佳实践

java - java Controller 中无法正确识别特殊/重音字符?

javascript - 正则表达式在 Javascript 中转换 URL

string - Go 编译器是否连接由加号分隔的字符串?

c++ - 为什么 'operator>' 需要 const 而 'operator<' 不需要?

algorithm - 如果存在,查找的最佳数据结构是什么?