我对这个事实感到有些惊讶
#include <string>
#include <cassert>
#include <cstdio>
int main()
{
printf("Floating point format: %.7g\n",1.4);
std::string a("Hello, World/#");
std::string b("Hello, World 2");
assert(a>b);
assert(setlocale(LC_ALL,"sv_SE.UTF-8")!=NULL);
printf("New floating point format: %.7g\n",1.4);
assert(b<a);
}
http://coliru.stacked-crooked.com/a/1b435636e4ff7161
此程序正常退出。结论,语言环境影响a和b之间的比较。那是对的吗?这意味着当在std :: set等中使用std :: string作为键时,在没有自定义比较函数的情况下,通过更改当前语言环境来打破排序不变量。
答案 0 :(得分:4)
运营商应该&lt; for std :: string是否受当前语言环境影响?
没有。运营商在内部使用std::string::compare
。这反过来使用std::string::traits_type
进行比较。 std::string::traits_type
是std::char_traits<char>
,它与区域设置无关。
结论,语言环境影响a和b之间的比较。
不能得出这样的结论,因为断言之间的顺序保持不变。
答案 1 :(得分:1)
你的结论是错误的:http://coliru.stacked-crooked.com/a/38971b91c881da2c
a>b
相当于b<a
,您确定要将a<b
或b>a
用于第二个assert
。