std::sort 何时停止比较
When does std::sort stop the comparison
正如你在标题中看到的,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"之外的几乎任何区域设置都可能完成这项工作。但是,如果您有变音符号,则几乎需要正确的区域设置才能使它们正确。
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++中"std::sort"比较器的不同类型
- C++ <algorithm> 使用对象作为比较定义的 sort()
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- 无法在 std::sort 中使用 cdef 函数作为比较函数
- std::sort 何时停止比较
- sort() 方法 c++ 中的比较器函数.为大量数字获得不同的解决方案
- 关于如何在 std::sort 和 std::p riority_queue 中使用自定义比较函数的困惑
- C++:为 std::sort 提供模板化比较函数
- std::sort 以严格的弱排序崩溃 - 与垃圾值进行比较
- sort()和stable_sort()的比较器的要求之间的差异
- std::sort与不严格的弱排序比较器可以作为拓扑排序工作
- 为什么当 std::sort 中的比较函数始终返回 true 时出现运行时错误
- 当参数相等时,为什么必须std :: sort比较函数返回false
- 类中的比较函数为 std::sort 无法编译
- 为什么这个自定义比较器在构造 std::p riority_queue 时无法解释 std::sort
- 如果我为浮点数定义了自定义比较函数,std::sort 会正常工作吗?
- 我可以防止 std::sort 复制传递的比较对象吗?
- 为什么 std::sort 有两个实现(带和不带比较器),而不是一个带有默认模板参数的实现