【问题标题】:When does std::sort stop the comparisonstd::sort 何时停止比较
【发布时间】:2017-12-13 08:51:10
【问题描述】:

正如你在标题中看到的,STL std::sort() 什么时候停止比较?

我的意思是我有一个这样的向量:

city name :: Marseille
city name :: Mont Saint Martin
city name :: Mont de Marsan

并且排序不会改变这个顺序,对我来说应该是:

city name :: Marseille
city name :: Mont de Marsan
city name :: Mont Saint Martin

我已经尝试过这些语法:

std::sort(vector.begin(), vector.end());
std::sort(vector.begin(), vector.end(), std::less<std::string>());

如果 std::sort() 在第一个空格处停止,请问这是一种解决方法吗?如何解决?

【问题讨论】:

  • 大写字母是“小于”小写字母
  • 这不是什么时候停止比较的问题,就像默认比较功能所做的那样 - 如果您想以不同的方式排序,您可以随时提供自己的。
  • 好的,我想我明白了,谢谢各位
  • @harold - 当字符以 ASCII 编码时确实如此,如今大多数系统都使用这种编码。但是还有其他的字符编码,一般不要求大写在小写之前。
  • @harold:我认为这有点不公平。它显然标准化了很多。更准确(和相关)的说法是,如果它禁止 EBCDIC,它就不是 C++ 标准。

标签: c++ sorting c++11 stl


【解决方案1】:

大多数典型系统使用 ASCII 或它的一些派生词。在 ASCII 中,所有小写字母都排在所有大写字母之后,所以 'A' &lt; 'Z''a' &lt; 'z' 和(您之前可能没有想到的部分,'Z' &lt; 'a'。也就是说,顺序(与其他一些穿插之间)是A..Za..z

按字母顺序排列时,大多数人(显然包括您)通常更喜欢AaBbCc...Zz 之类的东西。

我们可以用一个指定我们想要的相对顺序的表来实现这个——但是这个要求很常见,标准库已经提供了它。 std::locale 包含一个 collate 构面,它重载 operator() 以进行适合该语言环境的比较。如果我们将语言环境指定为比较运算符,std::sort 将自动使用该重载,因此我们可以执行以下操作:

std::sort(cities.begin(), cities.end(), std::locale(""));

“没有名称的区域设置”选择计算机已配置的区域设置,因此它通常是一个相当省钱的选择。看起来你正在处理法语,在那里你也有带有重音和坟墓等的字母。语言环境应该也知道如何正确排序。

如果您需要为某些特定语言环境指定排序(无论用户的计算机如何配置),您也可以这样做。例如,如果我想使用法语-加拿大排序,即使我的计算机配置为美国英语,我可以指定:

std::sort(cities.begin(), cities.end(), std::locale("fr-CA"));

接受的确切字符串集因编译器而异。标准中列出的唯一内容是“C”(默认情况下您已经拥有)和“”。由实施者决定支持哪些其他人。我上面使用的"fr-CA" 由微软的编译器支持,但是如果你在Linux 上使用gcc(例如)你可能需要指定一些其他字符串来获得相同的结果。

至少使用 Microsoft 当前的编译器,"""fr-CA" 将按照您的需要对这些字符串进行排序:

Marseille
Mont de Marsan
Mont Saint Martin

对于这些字符,“C”以外的几乎任何语言环境都可以完成这项工作。但是,如果您可能有变音符号,那么您将需要正确的语言环境来使它们正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2020-10-02
    • 2019-10-23
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多