我有一个C++应用程序,它使用STL集来保存字符串列表(有序和唯一).
我遇到的问题是下划线的排序方式与我需要的方式相反.
示例STL顺序:
"word0"
"word_"
Run Code Online (Sandbox Code Playgroud)
我需要的订单是:
"word_"
"word0"
Run Code Online (Sandbox Code Playgroud)
我已经开始实现自定义比较函数来处理这个问题,但我宁愿使用STL中提供的解决方案(如果有的话).
在线搜索,我发现一些引用这个完全相同的问题,但在其他系统中,解决方案似乎是更改排序规则或区域设置,但我似乎无法找到如何使用STL.
没有针对此特定问题的内置解决方案,因为库希望您构建自己的自定义比较器来处理此问题.
但是,您可能希望研究定义自己的char_traits类型,这样可以自定义字符串的排序和比较方式.虽然没有最好的在线教程,但这可能是解决您问题的最简洁,最简单的解决方案.作为一个无耻的插件,我写了一个关于这个问题char_traits的答案,这可能对你正在做的事情有用.
我建议你不要乱用语言环境.区域设计旨在用于本地化,旨在对文本的处理方式产生巨大而深远的影响.自定义比较器或新char_traits类型更直接地解决了手头的问题.
您可以使用std::lexicographic_compare自定义谓词来将字符串与自定义字符顺序 \xe2\x80\x93 进行比较,正如 Gnawme 已经说过的那样。以下代码将std::set与std::lexicographic_compare。
#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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |