题目:
编写一个模板函数 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*,因为不需要修改数组元素的值。
第二,指针算数运算,是根据它指向的数据类型的大小来的,++指针,意味着它指向下一个元素单元,而不是下一个字节。