2011-09-20 31 views
1

我讀過很多關於如何做到這一點的材料。不幸的是,他們都使用qsort以外的東西(通常是排序)。然而,這對我來說是不可能的,因爲我不允許使用算法庫中的任何東西。我必須從頭開始實現這一點,非常。我已經有了:qsorting類指針數組

class String { 
public: 
     char* string; 
     int size; 

     String(char* string=0, int size=0) { 
       this->string = string; 
       this->size = size; 
     } 
     ~String() { 
       delete [] string; 
     } 
}; 

int compare(void* obj1, void* obj2) { 
     String* str1 = ((String*) obj1)->getColumn(column); 
     String* str2 = ((String*) obj2)->getColumn(column); 

     int i = strcmp(str1->string, str2->string); 

     delete str1; 
     delete str2; 

     return i; 
} 

class ArrayList { 
     int count; 
     int arraySize; 
public: 
     String** list; 
     ArrayList() { 
       count = 0; 
       arraySize = 10; 
       list = new String*[arraySize]; 
     } 
     ~ArrayList() { 
       while(size()) { 
         delete remove(); 
       } 
     } 
     void add(String* s) { 
       if(count==arraySize) 
         grow(); 

       list[count++] = s; 
     } 

     String* remove() { 
       return list[count--]; 
     } 

     String* get(int i) { 
       return list[i]; 
     } 

     int size() { 
       return count; 
     } 
private: 
     void grow() { 
       String** temp = new String*[arraySize*=2]; 

       for(int i=0; i<count; i++) { 
         temp[i] = list[i]; 
       } 

       delete [] list; 

       list = temp; 
     } 
}; 

和我(目前)調用快速排序,雖然我已經試過許多種組合:

qsort(list->list, list->size, sizeof(String**), compare); 

錯誤我總是得到,無所謂我通過什麼:

argument of type ‘int (ArrayList::)()’ does not match ‘size_t’ 

我在這裏複製的代碼並不包括所有內容,但我已驗證所有這些代碼塊都按預期工作,因此不必擔心丟失的方法等。

+1

學習C++並且不被允許使用標準庫就像去跑步學校並被教導說「我們從基礎開始,所以你只允許使用你的左腿」。當然不是OP的錯,而是他的老師。 – janneb

+0

哦,我們被允許使用標準庫,只是不用於這個項目。在下一個項目中,我們可以使用字符串而不是cstrings,而在此之後的項目中我們可以使用標準庫。他只是希望我們能夠深入瞭解我們正在做的事情。這不是編程的入門課程,它是一個編程概念類,我們恰好使用C++。 –

+1

'qsort'與'std :: sort'完全一樣,除了一些令人討厭的演員,沒有任何目的,但會導致學生不必要的混淆。 – MSalters

回答

4

您已使用list->size而不是list->size()。代碼應該是:

qsort(list->list, list->size(), sizeof(String**), compare); 
+0

。 。 。當真?所有我能想到的不同組合,我只是忘了'()'?衛生署!它給了我另一個關於我的比較器不使用'const void *'的錯誤,但這很容易。謝謝謝謝! –