2012-10-24 70 views
0

嘗試比較排序算法的空缺。到目前爲止,我有這個,但如果你把它們投入整數,它有點擊敗IMO的目的。有沒有辦法比較空洞?我的教授耗盡了時間,並且被卡在網上。任何幫助表示讚賞。由於比較C++中的空缺

int fcmp(const void *one, const void *two) 
{ 
    if (*(int*)one > *(int*)two) return 1; 
    if (*(int*)one < *(int*)two) return -1; 
    return 0; 
} 
+0

「比較空洞」是什麼意思? void基本上什麼都沒有 - 並且在void *中,表示特定類型的*不存在 - 那麼C++如何知道要比較哪些內容? – cHao

+1

'void'是一個不完整的類型,所以你不能解引用'void *'。因此,沒有辦法*比較空洞*。因爲這是C++的標籤,你不應該使用[std :: sort](http://en.cppreference.com/w/cpp/algorithm/sort)。模板可以讓你避免這種「無效」的醜陋。 – Praetorian

+0

@Praetorian:提供模板的+1。我很想,但是。 :)雖然聽起來像這是一個編程練習,但是重新編寫像std :: sort這樣的東西是其中的一部分,這並不奇怪。 – cHao

回答

1

這看起來是一些標準庫函數中使用的標準比較函數,例如qsort(),其中您使用某種數據項的數組調用函數,並使用指示兩個元素是否相等的比較函數到每個或不是,如果不是,他們的整理順序是什麼。

那麼void指針指向的是程序員。這是在比較函數接口中使用void指針的目的,因爲調用比較函數的函數(如qsort())只是想知道兩個數組元素要進入什麼順序。它不知道數組元素是或如何做比較,它只知道數組的起始地址和每個元素的大小以及有多少元素。

標準庫的另一個功能是bsearch() function

所以要使用此功能,您可能需要使用以下代碼: 請參閱qsort() man page

typedef struct { 
    int iValue; 
    char sName[10]; 
} DataValue; 

// compare two elements of the array and indicate which one is higher 
// or lower in collating sequence or if they are equal. 
int dataComp (void *one, void *two) 
{ 
    return ((DataValue *)one)->iValue - ((DataValue *)two)->iValue; 
} 

int main (int argc, char *argv[]) 
{ 
    DataValue myData[25]; 
    //.. put some data stuff in the array. 
    // call qsort with the array. specify number of elements and size of each one 
    qsort (myData, sizeof(myData)/sizeof(myData[0]), sizeof(myData[0]), dataComp); 
} 
2

假設想法是在qsort的上下文中使用fcmp,你的代碼是完全有效的。

由於qsort不關心返回值是1-1,並會採取任何正數或負數,這個版本更短,但將與qsort很好的工作:

int fcmp (const void * one, const void * two) 
{ 
    return (*(int*)one - *(int*)two); 
} 

的原因qsort使用void*是讓你使用不同數據類型的相同算法。

+3

如果'one'是postive,'two'是否定的,你可以用你的快捷方式溢出並調用UB。 –

2

您沒有比較此代碼中的「空洞」。代碼將void指針轉換爲int指針,然後取消引用結果,這意味着您要比較指針指向的int。理想情況下,該功能會被寫成這樣:

int fcmp(const int *one, const int *two) 
{ 
    if (*one > *two) return 1; 
    if (*one < *two) return -1; 
    return 0; 
} 

但由於fcmp()在這種情況下,需要有特定的簽名不寫這樣的。否則它不能以通用的方式使用。例如,作爲對另一個函數的回調。