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行上。程序接下来要做的是按字母顺序对这些单词进行排序。
如何使用“排序”功能来执行此操作?如果没有,还有其他方法吗?
答案 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>
。