#include <iostream>
#include <array>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
array<char, 20> test{"HelloWorld"}, tmp;
// method 1
tmp = test;
sort(tmp.begin(), tmp.begin() + strlen(tmp.begin()));
cout << "result: " << tmp.data() << endl;
// method 2
tmp = test;
sort(tmp.begin(), tmp.end());
cout << "result: " << tmp.data() << endl;
return 0;
}
std::array
可以使用方法1进行排序。但它太丑了。
我更喜欢方法2,但不能返回任何内容。它有什么问题?
答案 0 :(得分:4)
第二种方法是将所有\0
元素排序到前面。 (他们 比任何其他角色少。
当您尝试使用.data()
进行打印时,会得到一个char const*
对象,将流类视为C-String。哪个是以空字符结尾的字符串。由于第一个字符为空,因此不打印任何内容。
您可以使用
修复 auto cmp = [](char a, char b) { return a != '\0' && a<b; }
sort(tmp.begin(), tmp.end(), cmp);
这使用了一个比较器,最后对\0
进行排序。
但正如Jerry Coffin在评论中所说,std::array
不是std::string
- 请使用符合您需求的那个(在这种情况下可能是std::string
)。
答案 1 :(得分:2)
您正在打印一个C-String,它依赖于终止空字符的存在:\0
。
对整个数组进行排序时,将该空字符移动到前面,这会告诉打印函数它是一个空字符串。
因此,您别无选择,只能使用丑陋的版本。话虽如此,这是一种更安全的写作方式,你可能更愿意:
sort(tmp.begin(), find(tmp.begin(), tmp.end(), '\0'));