2013-08-27 59 views
0

假設我想在C++定義的函數等如何處理在C對數組定義函數++

int sort(int a[n], int n) 

我在哪裏希望函數做沒有預定長度的陣列上操作。我該怎麼做?

+3

儘管它看起來像,該函數不採取預定義長度的陣列 –

+0

目前還不清楚,如果您認爲這需要一個特定的長度,並且您希望它採取可變長度或其他方式。 –

回答

5

你可以讓你的函數模板,給你的陣列的尺寸手柄:

template <size_t N> 
int mysort(int (&a)[N]) 
{ 
    /// access as a[n], where n is in range [0,N) 
} 

但更地道的方式,因爲它也有工作標準庫容器和動態大小的數組,將通過兩個迭代器:

template<typename Iterator> 
int mysort(Iterator begin, Iterator end) { ... } 

T母雞

int arr[] = {1,54,3,7,9,87}; 
mysort(arr); 
mysort(std::begin(arr), std::end(arr)); 

請記住我的名字改爲mysort因爲標準庫中有一個著名的算法稱爲std::sort

+0

請注意,對於動態分配的數組,std :: end不能很好地工作,因爲C++中的數組通常不知道它們的長度。 ('std :: end(real_array_not_a_pointer)'只能用,因爲編譯器看到你將該變量聲明爲一個特定大小的數組)。所以你必須通過'begin'和'begin + size'。但是,查找「開始+大小」當然需要在某個時刻知道「大小」。 – cHao

+0

@cHao正確。當然,第一種選擇也不行。 – juanchopanza

5

最習慣的方法是定義一個函數,它接受兩個迭代器:

template<typename Iter> 
int sort(Iter first, Itera last); 

在羅馬,入鄉隨俗做(「羅馬」 =標準庫)。

0

使用指針:

int sort(int* a, int n) 
1

如果您想使用該結構,您需要一些方法來確定數組的末尾。例如,字符串作爲char數組使用空終止符。如果你沒有辦法確定結構的結尾,你將無法安全地迭代它。

指針方法將允許您遍歷數組,但是您將無法在迭代時安全地確定數組的末尾。

int sort(int* arr) 
{ 
    // do your sorting here 
} 
0

有一些標記數組末尾的元素。這就是大多數字符串操作的工作方式,字符串的末尾用'\ 0'標記。

儘管如此,理想情況下,您不會傳遞一個普通數組,但會傳遞一些更高級別的對象,如std::vectorstd::array

2

編譯器會忽略數組參數的大小,因爲當您將數組傳遞給函數時,它將轉換爲指針。事實上,

int sort(int a[], int n) 

相當於

int sort(int* a, int n) 

陣列的大小將是未知的,直到運行時間和應作爲第二個參數被傳遞。

+0

這不完全等同。除非'n'是之前聲明的常量表達式,否則它只是無效的代碼。 – jrok

+0

@jrok我認爲編譯器會忽略指定的大小。我知道,如果你沒有指定尺寸,那麼這兩個是相當的...編輯,以顯示相反。 –

+0

你是對的,它忽略了它,問題在於聲明。 'const int n = 5; int sort(int a [n],int n);'會很好,它的行爲如你所說。 Nitpicking有點:) – jrok

1

你不能完全按照你所要求的。我想最接近的將是使用std::vector<int>

int sort(std::vector<int>& a) 
{ 
    ... 
} 

std::vector支持所有常見的數組操作(a[i]等。)再加上幾個,如a.size()以獲得矢量的大小。