嘗試比較排序算法的空缺。到目前爲止,我有這個,但如果你把它們投入整數,它有點擊敗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;
}
嘗試比較排序算法的空缺。到目前爲止,我有這個,但如果你把它們投入整數,它有點擊敗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;
}
這看起來是一些標準庫函數中使用的標準比較函數,例如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);
}
假設想法是在qsort
的上下文中使用fcmp
,你的代碼是完全有效的。
由於qsort
不關心返回值是1
或-1
,並會採取任何正數或負數,這個版本更短,但將與qsort
很好的工作:
int fcmp (const void * one, const void * two)
{
return (*(int*)one - *(int*)two);
}
的原因qsort
使用void*
是讓你使用不同數據類型的相同算法。
如果'one'是postive,'two'是否定的,你可以用你的快捷方式溢出並調用UB。 –
您沒有比較此代碼中的「空洞」。代碼將void
指針轉換爲int
指針,然後取消引用結果,這意味着您要比較指針指向的int
。理想情況下,該功能會被寫成這樣:
int fcmp(const int *one, const int *two)
{
if (*one > *two) return 1;
if (*one < *two) return -1;
return 0;
}
但由於fcmp()
在這種情況下,需要有特定的簽名不寫這樣的。否則它不能以通用的方式使用。例如,作爲對另一個函數的回調。
「比較空洞」是什麼意思? void基本上什麼都沒有 - 並且在void *中,表示特定類型的*不存在 - 那麼C++如何知道要比較哪些內容? – cHao
'void'是一個不完整的類型,所以你不能解引用'void *'。因此,沒有辦法*比較空洞*。因爲這是C++的標籤,你不應該使用[std :: sort](http://en.cppreference.com/w/cpp/algorithm/sort)。模板可以讓你避免這種「無效」的醜陋。 – Praetorian
@Praetorian:提供模板的+1。我很想,但是。 :)雖然聽起來像這是一個編程練習,但是重新編寫像std :: sort這樣的東西是其中的一部分,這並不奇怪。 – cHao