【问题标题】:Getting incorrect size of an array after merging two arrays合并两个数组后得到不正确的数组大小
【发布时间】:2019-07-12 06:24:35
【问题描述】:

我拿了两个数组,然后将这两个数组合并到一个新创建的第三个数组中,它可以工作,但是当我输出数组的大小时,我得到的大小为“1”。我不明白为什么该数组的大小是“1”,即使其中有 5 个元素。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int arr1[] = { 1,2,3 };
    int arr2[] = { 9,4 };
    int size1 = sizeof(arr1) / sizeof(int);
    int size2 = sizeof(arr2) / sizeof(int);

    int *arr = new int[size1 + size2];

    //merging the two arrays by transferinng the elements into the third array
    for (int i = 0; i < size1; i++)
    {
        arr[i] = arr1[i];
    }
    for (int i = size1; i < (size1 + size2); i++)
    {
        arr[i] = arr2[i - size1];
    }

    //sorting the array
    sort(arr, arr + (size1 + size2));
    cout << endl;

    //finding the size of newly merged array
    int mergeSize = sizeof(arr) / sizeof(int);
    cout << "The size of the array is " << mergeSize << endl;   //why am I getting the size of the array as '1'
    return 0;
}

【问题讨论】:

标签: c++ arrays data-structures


【解决方案1】:

sizeof(arr) 为您提供指针 arr 的大小,这与您为其分配的元素数量无关。

使用std::array 避免此问题。它没有std::vector 的开销,并且比C 样式的数组更易于使用。

int main()
{
    array<int, 3> arr1 = { 1, 2, 3 };
    array<int, 2> arr2 = { 9, 4 };

    array<int, arr1.size() + arr2.size()> arr;

    //merging the two arrays by transferinng the elements into the third array
    for (int i = 0; i < arr1.size(); i++)
    {
        arr[i] = arr1[i];
    }
    for (int i = 0; i < arr2.size(); i++)
    {
        arr[i + arr1.size()] = arr2[i];
    }

    //sorting the array
    sort(arr.begin(), arr .end());
    cout << endl;

    //finding the size of newly merged array
    int mergeSize = arr.size();
    cout << "The size of the array is " << mergeSize << endl;   //why am I getting the size of the array as '1'
    return 0;
}

【讨论】:

  • 这个我没有直接测试过;但我不太确定这行代码:array&lt;int, arr1.size() + arr2.size()&gt; arr; 是否会编译。实例化std::array 的实例并设置其第二个模板参数时;它不要求第二个参数必须在编译时(而不是运行时)既是常量又是已知的?
  • @FrancisCugler,大小恒定的并且在编译时已知。当array 模板需要一个常量并且在编译时已知大小参数时,为什么不呢?
  • 我不是 100% 确定;而且我还没有测试过...您可能是对的,这就是为什么我只是要求澄清一下!
  • 我能够测试它;是的,它确实考虑了:std::array.size() 在编译时已知并且是常量。
【解决方案2】:

arr 不是数组,它是一个指针,在指针上使用sizeof 会给出指针的大小,而不是它指向的动态数组的大小。 sizeof 的指针通常是 4 或 8,这取决于您使用的是 32 位还是 64 位系统。

您可以通过使用向量而不是数组来避免这些问题。向量有一个size 方法,它总是给出实际大小。数组在 C++ 中相当糟糕。

【讨论】:

  • 他为什么要使用vectorstd::array 怎么了?
  • std::array 很好,尽管它不适用于上述任务。
  • 为什么不呢?
  • 因为std:::array&lt;int, size1 + size2&gt; arr; 无法编译。并且重新编写代码以使其能够编译对我来说实在是太麻烦了。但是,如果您想给出一个答案,说明如何使用 std::array 来完成此任务,那么请成为我的客人。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2019-11-28
  • 2012-03-18
  • 1970-01-01
  • 2019-07-21
  • 2021-02-02
  • 1970-01-01
  • 2016-09-16
相关资源
最近更新 更多