我正在使用qsort对C++中的字符串数组进行排序。我的代码如下:如何使用qsort在C++中对字符串数组进行排序?
#include <iostream>
#include <cstdlib>
using namespace std;
int CompareString(const void * e1, const void * e2) {
string * s1 = (string *) e1;
string * s2 = (string *) e2;
if(*s1 < *s2) return -1;
else if(*s1 == *s2) return 0;
else if(*s1 > *s2) return 1;
}
int main() {
string Array[4] = {"hehe","789","456","123"};
qsort(Array,4,sizeof(string),CompareString);
for(int i = 0;i < 4;++i)
cout << Array[i] << endl;
return 0;
}
但它收到运行时错误。我确实知道这种做法,但我想知道为什么我不能使用qsort。谢谢:)
这个问题类似于This Question 但也有一些差异。在这个问题中,人们建议使用sort来代替,或者在平凡的类型上使用qsort。但是,我的问题是我必须使用qsort而不是排序,所以我的问题没有解决这个问题,我不认为我的问题是重复的。至于为什么我不得不使用qsort而不是排序,答案是“这是分配的要求”,链接是:Here。我如下翻译原题:
实施MyString的类,它继承了STD:字符串,该代码被编译并且用下面的代码正常运行:
MyString SArray[4] = {"big","me","about","take"};
qsort(SArray,4,sizeof(MyString), CompareString);
for(int i = 0;i < 4;++i)
cout << SArray[i] << endl;
MyString的应该是这样的:
class MyString:public string{
...
};
这个原始问题需要MyString来通过其他测试,我已经通过了。但我仍然无法通过qsort,所以我调整它,并问我的第一版quesion。
从答案中,我可以得出结论:qsort不适用于非POD。由于MyString继承了字符串,并且字符串是非POD,所以MyString是非POD,因此MyString无法通过测试。
谢谢大家回答我的问题:)
'sizeof(string)'看起来对我很可疑。这意味着该算法将假定对象是POD(无C++)。将'string'转换为'const char *'可能会工作。 –
未定义的行为,因为'std :: string'不能保证与'qsort'一起使用。阅读这个问题的答案:http://stackoverflow.com/questions/6174955/what-kinds-of-types-does-qsort-not-work-for-in-c –
使用'std :: sort'。 'qsort'是令人讨厌的旧C。 –