7. 計算數組元素個數函數


題目:

編寫一個模板函數 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*,因為不需要修改數組元素的值。

第二,指針算數運算,是根據它指向的數據類型的大小來的,++指針,意味着它指向下一個元素單元,而不是下一個字節。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM