<algorithm>内部的“ sort”函数可以用于对二维char数组进行排序吗?

时间:2019-03-20 11:40:09

标签: c++ algorithm sorting matrix char

char s[251],c[13][21],*p;
int n;
f.get(s,251);
p=strtok(s," ");
n=0;
while(p)
{
    strcpy(c[n],p);
    ++n;
    p=strtok(NULL," ");
}

代码将多个单词隔开,然后将n个单词放在“ c”字符矩阵的n-1行上。程序接下来要做的是按字母顺序对这些单词进行排序。

如何使用“排序”功能来执行此操作?如果没有,还有其他方法吗?

3 个答案:

答案 0 :(得分:4)

不,您不能std::sort char[][],因为数组是不可分配的。您可以对char*[]进行排序,因为指针是。

但是,我建议您使用char[][]而不是std::vector<std::string>并对其进行排序,或者使用std::set<std::string>对其元素执行字母顺序。

std::string line;
f.getline(line);
std::stringstream ss(line);
std::vector<std::string> words(std::istream_iterator<std::string>(ss), {});
std::sort(std::begin(words), std::end(words));

答案 1 :(得分:4)

不。 std::sort不能用于对2D数组进行排序,因为2D数组的元素是数组,并且数组不可交换,这是std::sort要求的。

您可以使用Ted所示的std::array,这对于像您这样的小型阵列可能很好。但是一定要意识到交换数组具有线性复杂性,因此对大数组进行数组元素排序可能会很慢。

如果希望对数组数组进行排序,最好使用间接寻址。代替子数组,使用对数组的引用。我的意思是一般意义上的参考;您不能包含T&个引用的数组。您可以保持2D数组不变,但是对指向该2D数组的指针进行排序:

char* rows[std::size(c)];
for(size_t i = 0; i < std::size(c); i++)
    rows[i] = c[i];
}
std::sort(std::begin(rows), std::end(rows), [](char* l, char* r){
    return std::strcmp(l, r) < 0;
});
// rows now contains pointers to each row of c; in sorted order

如果希望修改原始数组而不是“指针视图”,则应在原始数组本身中使用间接寻址。为此,您需要动态分配,最简单的解决方案是std::string

std::array<std::string, 13> c;

即使没有自定义比较对象,也可以对其进行排序。请注意,尽管数组中的字符串为空,所以您必须首先通过例如插入字符来增大它们。它不是元素在整个生存期内都存在的数组的直接替代。

答案 2 :(得分:1)

正如已经回答的,不,你不能。但是,您可以使用std::array,其中std::sort将对内部数组进行字典比较。

std::array<std::array<char, 21>, 13> c;
//...
std::sort(c.begin(), c.end());

for(const auto& v : c)
    std::cout << v.data() << "\n";

请注意,这是一种非常慢的字符串排序方式,因为内部数组(std::array<char, 21>)将在需要更改位置时逐字节复制。请改用std::vector<std::string>