std::sort 何时停止比较

When does std::sort stop the comparison

本文关键字:比较 sort std 何时停      更新时间:2023-10-16

正如你在标题中看到的,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(( 在第一个空格处停止,请问这是一种绕过它的方法以及如何解决?

大多数典型的系统使用ASCII或它的某种衍生物。在 ASCII 中,所有小写字母都位于所有大写字母之后,因此'A' < 'Z''a' < 'z'和(您可能以前没有预料到的部分,'Z' < '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"(默认情况下已经得到的(和"。由实施者决定支持哪些其他人。Microsoft 的编译器支持我上面使用的"fr-CA",但是如果您在 Linux 上使用 gcc(例如(,您可能需要指定其他一些字符串才能获得相同的结果。

至少使用 Microsoft 的当前编译器,"""fr-CA"都可以根据需要对这些字符串进行排序:

Marseille
Mont de Marsan
Mont Saint Martin

对于这些字符,除"C"之外的几乎任何区域设置都可能完成这项工作。但是,如果您有变音符号,则几乎需要正确的区域设置才能使它们正确。