什么时候std :: sort停止比较

时间:2017-07-09 15:44:57

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

正如您在标题中看到的那样,STL std :: sort()何时停止比较?

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

this

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

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()在第一个空格处停止,是否可以解决这个问题以及如何解决?

1 个答案:

答案 0 :(得分:3)

大多数典型系统使用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"是微软编译器支持的,但是如果你在Linux上使用gcc(例如),你可能需要指定一些其他字符串来获得相同的结果。

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

Marseille
Mont de Marsan
Mont Saint Martin

对于这些字符,几乎所有“C”以外的语言环境都可能完成这项工作。但是,如果您可能有变音标记,那么您只需要正确的语言环境即可使它们正确无误。