如何更改STL中下划线的排序顺序?

Pau*_*nto 8 c++ sorting stl

我有一个C++应用程序,它使用STL集来保存字符串列表(有序和唯一).

我遇到的问题是下划线的排序方式与我需要的方式相反.

示例STL顺序:

"word0"
"word_"
Run Code Online (Sandbox Code Playgroud)

我需要的订单是:

"word_"
"word0"
Run Code Online (Sandbox Code Playgroud)

我已经开始实现自定义比较函数来处理这个问题,但我宁愿使用STL中提供的解决方案(如果有的话).

在线搜索,我发现一些引用这个完全相同的问题,但在其他系统中,解决方案似乎是更改排序规则或区域设置,但我似乎无法找到如何使用STL.

tem*_*def 7

没有针对此特定问题的内置解决方案,因为库希望您构建自己的自定义比较器来处理此问题.

但是,您可能希望研究定义自己的char_traits类型,这样可以自定义字符串的排序和比较方式.虽然没有最好的在线教程,但这可能是解决您问题的最简洁,最简单的解决方案.作为一个无耻的插件,我写了一个关于这个问题char_traits的答案,可能对你正在做的事情有用.

我建议你不要乱用语言环境.区域设计旨在用于本地化,旨在对文本的处理方式产生巨大而深远的影响.自定义比较器或新char_traits类型更直接地解决了手头的问题.

  • +1:我只想补充一点:如果你只需要在`set`(s)中改变排序顺序 - 使用自定义比较器,这是最简单和预期的方式.如果您需要全局更改字符串的排序顺序(在应用程序的范围内) - 使用自定义`char_traits`键入自定义字符串. (3认同)

Chr*_*mer 4

您可以使用std::lexicographic_compare自定义谓词来将字符串与自定义字符顺序 \xe2\x80\x93 进行比较,正如 Gnawme 已经说过的那样。以下代码将std::setstd::lexicographic_compare

\n\n
#include <iostream>\n#include <set>\n#include <string>\n#include <algorithm>\n\nstruct comp\n{\n    static bool compchar(char a, char b)\n    {\n        if (a == \'0\' && b == \'_\' || a == \'_\' && b == \'0\')\n            return !(a < b);\n        else\n            return (a < b);\n    }\n\n    bool operator()(const std::string& a, const std::string& b) const\n    {\n        return std::lexicographical_compare(a.begin(), a.end(),\n                                            b.begin(), b.end(),\n                                            compchar);\n    }\n};\n\nint main()\n{\n    std::set<std::string, comp> test;\n    test.insert("word0");\n    test.insert("word_");\n\n    for (std::set<std::string, comp>::const_iterator cit = test.begin();\n         cit != test.end(); ++cit)\n         std::cout << *cit << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n