題目:
編寫一個模板函數 count,返回值是數組 a[0: n - 1]的數值個數。測試你的代碼。
思路:
首先,函數計算數組個數,返回值應該是 size_t 類型,為了簡單起見,將其設為 int 類型。
下面考慮函數參數。一般來說,涉及數組的問題,需要傳入數組名和數組元素個數。這里需要詳細說明一下關於數組的知識。
數組是一系列相同元素的集合,訪問數組元素,可以通過數組下標來實現。現在假設有一個數組,名字叫 array ,它包含 5 個元素。array[0] , array[1],分別代表數組的第一,第二個元素。
數組名實際上是一個指針,並且是一個常量指針(它以后不能指向另外一個數組),它指向數組第一個元素的首地址。也就是說,數組名實際包含的是一個地址,並沒有其余信息。在傳遞參數時,知道了數組類型,就可以計算出每個元素的大小;知道數組名,就知道了起始地址;除此之外,還需要傳入一個元素個數,這樣就獲得了所需的全部信息。函數便能夠處理數組。
但是本題並沒有數組元素個數,如何獲得?數組元素的個數可以計算:通過 sizeof(數組名),可以獲得數組的大小;通過 sizeof(數組類型),可以獲得每個元素的大小,於是 sizeof(數組名)/ sizeof(數組類型),就獲得了數組元素的個數。這種方法在函數外行的通,但是當數組作為參數傳入函數時,數組名僅僅是一個指針,此時 sizeof(數組名)計算出的是指針所占空間的大小,與數組大小是無關的,故該法失效。經查找資料,發現兩個函數可以使用:begin(),end()函數。
代碼:
1 #include <iostream> 2 using namespace std; 3 4 template <typename T> 5 int count_array_size (const T* arr_begin, const T* arr_end) { 6 int cnt = 0; 7 while (arr_begin != arr_end) { 8 ++arr_begin; 9 ++cnt; 10 } 11 12 return cnt; 13 } 14 15 int main() { 16 int arr[5] { 0, 1, 2, 3, 4 }; 17 int arr_number = count_array_size(begin(arr), end(arr)); 18 cout << "Count : " << arr_number << endl; 19 20 return 0; 21 }
解釋代碼中兩處地方:
第一,參數類型使用的是 const T*,因為不需要修改數組元素的值。
第二,指針算數運算,是根據它指向的數據類型的大小來的,++指針,意味着它指向下一個元素單元,而不是下一個字節。