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

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

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/12303177.html
Copyright © 2011-2022 走看看