c++ - std::sort 什么时候停止比较

标签 c++ sorting c++11 stl

如标题所示,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/

相关文章:

c++ - 在C++中删除一个字符串对象

c# - 如何获取在windows平台上传输和接收的字节数?

ios - 在内部嵌套的 NSDictionary 中按值对 NSDictionary 进行排序

Perl 自然地对数字进行排序

c++ - 是否可以制作32位gRPC和protobuf?

c++ - 迭代 vector 以识别段落

php - 如何按文档 ID 对 sphinx 结果进行排序

c++ - C++11 之前的可变参数模板

c++ - 绑定(bind)数据成员在 VS2012 中不起作用?

c++ - 非类名 C++11 类型名是一个简单的模板 ID?