我正在使用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。 –