如标题所示,STL std::sort() 何时停止比较?
我的意思是我有一个这样的 vector :
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”(这是默认情况下您已经获得的)和“”。由实现者决定其他人支持什么。 "fr-CA"
我在上面使用的是 Microsoft 编译器支持的,但是如果您在 Linux 上使用 gcc(例如),您可能需要指定一些其他字符串才能获得相同的结果。
至少对于微软当前的编译器,""
或 "fr-CA"
将根据需要对这些字符串进行排序:
Marseille
Mont de Marsan
Mont Saint Martin
对于这些字符,除了“C”之外的几乎任何语言环境都可以完成这项工作。但是,如果您可能有变音符号,您将只需要正确的语言环境来使它们正确。
关于c++ - std::sort 什么时候停止比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44998169/