• 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*,因为不需要修改数组元素的值。

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

  • 相关阅读:
    Javascript 正确用法 二
    c# 未能载入文件或程序集
    Linux系统备份
    环保创业的可行之道——Leo鉴书上66
    Oracle的序列
    UVA 10574
    网页内容的html标签补全和过滤的两种方法
    使用POI来实现对Excel的读写操作
    OVER(PARTITION BY)函数介绍
    Kill 正在执行的存储过程
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/12303177.html
Copyright © 2020-2023  润新知