【问题标题】:find number of element of array when it use as parameter in C++在 C++ 中用作参数时查找数组元素的数量
【发布时间】:2018-07-11 14:18:06
【问题描述】:

我用 C++ 编写了一个函数,该函数应该计算数组的元素数。函数接收数组作为其参数。所以我尝试了以下方法:

int countArray(int a[])
{
    int size = 0;
    while(a[size] != NULL)
    {
        size++;
    }
    cout<<"number of array elements are : "<<size<<endl;
}

此功能有效,但并不完美。当我将一个数组传递给这个函数时,它的元素数量与它的大小 int one[3] = {1,2,3} 或一个未调整大小的数组的元素数量相同,它将返回一个包含更多元素的结果。例如,对于前面的数组one[3],它将显示数组元素的数量为 4
但在其他情况下它工作正常。例如,如果我传递一个元素少于其大小的数组int two[4] = {1,2,3},它将起作用。
我应该在这个例子中使用数组而不是 vectorstruct ,所以我应该怎么做或者函数不能使用这种数组作为它的参数的原因是什么.

【问题讨论】:

  • 你找不到那个尺寸。您需要将其作为参数传递,使用模板传递大小或使用适当的 c++ 容器,如 std::vector。在现代 C++ 中处理容器的惯用方式是传递范围(迭代器对)。
  • a[size] != NULL 是否检查数组中该索引处是否有元素
  • 为了理智,将 NULL 替换为 nullptr。如果它没有编译,那么你做的不正确。
  • @AliDK 然后使用std::vector。可移植 C++ 中也不允许使用可变长度数组。

标签: c++ arrays


【解决方案1】:

一旦数组衰减到一个指针(指向它的第一个元素),就无法获得它的大小。

您拥有的循环可以(并且很可能)超出范围,您将拥有undefined behavior

有三种可能的解决方案:

  1. 改用std::array

  2. 改用std::vector

  3. 对模板使用数组大小​​推导:

    template<size_t N>
    int countArray(int (&a)[N]) { ... }
    

另请注意,C++ 没有“空”值的概念。符号常量NULL 仅用于指针

【讨论】:

  • 正如我提到的,我尝试std::array,但它适用于固定大小的数组,并且数组参数应该没有大小。我可以在函数参数中使用std::vector 作为未调整大小的数组吗?你能举个例子说明我应该怎么做。
【解决方案2】:

当数组作为参数时,这个函数不起作用,它衰减成指针,NULL为0:

int a[5] = { 1,2,0,0,0 };
int countArray(int a[])
{
    int size = 0;
    while (a[size] != NULL)
    {
        size++;
    }
    cout << "number of array elements are : " << size << endl;
    return size;
}

正确答案是 5,但输出是 2。

你应该如下改变这个函数:

int countArray(int a[], int size)
{
    cout << "number of array elements are : " << size << endl;
    return size;
}

然后你可以这样称呼它:

int a[5] = { 1,2,0,0,0 };
countArray(a, 5);

【讨论】:

  • 感谢您提及我之前没有意识到的这一点。我想我必须改变我使用的方法,因为它不是完美的。
【解决方案3】:

在这个例子中我应该使用数组而不是向量或结构

通过阅读您的 cmets 和您的初始帖子,我只是尝试猜测您获得了哪些数据以及您必须做什么。是不是给了你一个具有以下属性的整数数组:

  1. 至少一个元素
  2. 最后一个元素保证为0
  3. 除了最后一个元素之外没有其他元素是 0

然后 - 并且只有这样 - 您尝试的解决方案才会奏效。 int two[4] = {1,2,3} 的示例之所以有效,是因为您创建了一个包含 4 个元素的数组。但仅使用聚合初始化初始化 3。所以剩余的(以及最后一个元素)设置为 0。

使用整数检查 NULL 的工作方式与使用 0 的检查相同。

【讨论】:

  • 数组没有必要至少有一个元素,我想如果有人向它传递一个空数组并且它应该返回零作为它的元素数,我的函数就可以工作。我明白你的意思,为什么函数使用更少元素的更大数组,因为剩余元素为零,等于 null
  • 问题是:如果数组为空,则不允许访问第一个元素。这就是你在while循环中无条件地做的事情。再说一遍:没有办法可以“计算”数组大小,除非您知道最后一个元素具有哪个值(例如分隔符)
猜你喜欢
  • 2015-02-14
  • 1970-01-01
  • 2021-09-26
  • 2012-03-22
  • 2015-03-01
  • 2021-06-11
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多