C++ Can";排序“;函数内部的<;算法>;是否用于对二维字符数组进行排序?
代码获取由空格分隔的多个单词,然后将n个单词放在“c”字符矩阵的n-1行上。程序接下来应该做的是按字母顺序对这些单词进行排序C++ Can";排序“;函数内部的<;算法>;是否用于对二维字符数组进行排序?,c++,algorithm,sorting,matrix,char,C++,Algorithm,Sorting,Matrix,Char,代码获取由空格分隔的多个单词,然后将n个单词放在“c”字符矩阵的n-1行上。程序接下来应该做的是按字母顺序对这些单词进行排序 如何使用“排序”功能来完成此操作?如果没有,还有其他方法吗?没有,您不能std::sortchar[][]s,因为数组是不可分配的。您可以对char*[]s进行排序,因为指针是 但是我建议您使用std::vector并对其进行排序,或者使用std::set对其元素执行字母顺序,而不是char[][] char s[251],c[13][21],*p; int n; f.g
如何使用“排序”功能来完成此操作?如果没有,还有其他方法吗?没有,您不能
std::sort
char[][]
s,因为数组是不可分配的。您可以对char*[]
s进行排序,因为指针是
但是我建议您使用std::vector
并对其进行排序,或者使用std::set
对其元素执行字母顺序,而不是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," ");
}
std::字符串行;
f、 getline(line);
std::stringstream ss(线路);
std::向量词(std::istream_迭代器(ss),{});
std::sort(std::begin(单词),std::end(单词));
否。std::sort
不能用于对2D数组进行排序,因为2D数组的元素是数组,数组不可交换,这是std::sort
所要求的
您可以使用所示的std::array
,这对于像您这样的小数组可能很好。但请务必认识到,交换数组具有线性复杂性,因此对大型数组的数组元素进行排序可能会非常慢
如果希望对数组进行排序,最好使用间接寻址。使用对阵列的引用而不是子阵列。我指的是一般意义上的参考;不能有T&
引用的数组。可以保持2D数组不变,但对指向该2D数组的指针数组进行排序:
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));
这甚至可以在没有自定义比较对象的情况下进行排序。请注意,数组中的字符串是空的,因此必须首先通过插入字符等方式增加字符串。对于元素在整个阵列生命周期内都存在的阵列,它不是一个临时替代品。如前所述,不可以。但是,您可以使用
std::array
,其中std::sort
将对内部数组进行词典比较
std::array<std::string, 13> c;
std::数组c;
//...
排序(c.begin(),c.end());
用于(常数自动和v:c)
难道这个答案完全正确吗。但是可能需要指出的是,排序
std::array
元素可能会非常慢。std::array
的自然比较将包括存储在char数组样式字符串末尾之后的任何垃圾。这可能是一个问题。要解决@Galik:Value initialisec
指出的问题,使垃圾只是空终止符。strcpy
将在感兴趣的字符后放置一个\0
,因此在词典比较中,其他字符是什么并不重要,是吗?@TEDLYNMO词典比较不会在'\0'
处停止。另一个修复方法是使用std::strcmp
,如我在指针建议中所示。
std::array<std::string, 13> c;
std::array<std::array<char, 21>, 13> c;
//...
std::sort(c.begin(), c.end());
for(const auto& v : c)
std::cout << v.data() << "\n";