如何使用std :: sort对std :: array进行排序?

时间:2016-05-15 15:31:31

标签: c++ arrays sorting c++11 stl

#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,但不能返回任何内容。它有什么问题?

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'));