zoukankan      html  css  js  c++  java
  • 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*,因为不需要修改数组元素的值。

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

  • 相关阅读:
    编译FreePascal和Lazarus
    QTreeView使用点点滴滴
    刨根问底儿 -- intVal($str) 跟 (int) $str 的运算结果有什么区别
    Qt源代码分析
    QString够绕的,分为存储(编译器)和解码(运行期),还有VS编译器的自作主张,还有QT5的变化
    C++静态变量本身可否是一个实例对象
    QT4.86写中文XML
    点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)
    Hibernate3.0中的session.find()问题
    曲线控件我一直用codeproject上的那几个(C++ 100款开源界面库)
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/12303177.html
Copyright © 2011-2022 走看看