【问题标题】:Sort a vector of wstrings, but case insensitive对 wstrings 向量进行排序,但不区分大小写
【发布时间】:2018-01-11 10:22:52
【问题描述】:

当对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,但我不知道如何使用。

(由于我正在寻找一种有效的排序方式,能够在短时间内对数百万个 wstrings 进行排序,我认为暂时存储所有 wstrings 小写的副本,并对这个第二个向量进行排序不是一个好方法想法?)

【问题讨论】:

  • 当您使用 Unicode 时,您可以为 Unicode“字符”定义不区分大小写吗? (注意它不是 1 ASCII 集之外的 1 映射)
  • @0x5453 已经尝试过,它也不起作用。

标签: c++ string sorting vector


【解决方案1】:

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

你想要std::ctype&lt;wchar_t&gt;::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&lt;wchar_t&gt;::tolower

【讨论】:

  • 谢谢!我现在不能让它工作,你能粘贴整行std::sort(....);吗?提前致谢!
  • @Basj 为您添加了sort 调用示例。
  • 谢谢!我将不得不考虑几分钟,为什么要双重实施比较?一次使用 lexicographical_compare,另一次使用 ...
  • @Basj lexicographical_compare 将字符串符号与比较函数进行比较,该函数在比较它们之前将符号小写。
  • 哦,好的,我明白了!最后一个细节:我可以避免 locale() 吗?我可以接受不是 100% 完美的排序(在非 ascii 字符的情况下)。我更喜欢快速比较而不是与语言环境进行较慢的比较。
猜你喜欢
  • 2020-08-17
  • 2018-03-16
  • 2011-01-30
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2016-10-05
相关资源
最近更新 更多