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*,因为数组名是常量指针。

第二,指针算数运算,是根据它指向的数据类型的大小来的,++指针,意味着它指向下一个元素单元,而不是下一个字节。

猜你喜欢

转载自www.cnblogs.com/Hello-Nolan/p/12303177.html