【问题标题】:resize array and add element c++调整数组大小并添加元素 c++
【发布时间】:2018-11-26 17:10:25
【问题描述】:

嘿,我知道这很简单,但由于某种原因,我的日子比我想象的要艰难。我想要做的只是如果我的动态数组的大小等于其中的实际元素数量(意味着它已满),那么我想将数组的大小加倍并添加元素

    int add_element(int *array, int size , int &count)
{
    int temp;
    cout << "What number do you want to add ? " << endl;
    cin >> temp;
    if(count = size)
    {
        copy(array, size);
        count++;
        array[count] = temp;
    }
    return count;
}

void copy(int *oldArr  , int size)
{
    int temp = size * 2;
    int *newArr = new int[temp];

    for (int i = 0; i < size; i++) 
    {
        newArr[i] = oldArr[i];

    }
    //delete[] oldArr;
    oldArr = NULL;
    oldArr = newArr;
    delete[] oldArr;

我遇到的问题是,实际上并没有将数组的大小加倍,因为当我尝试查找元素时,它只是返回地址空间。 任何帮助将不胜感激

***********编辑********* 我继续进行了这些更改,但我的数组似乎仍然没有改变大小

void add_element(int* &array, int size , int &count)
{
    int temp;
    cout << "What number do you want to add ? " << endl;
    cin >> temp;
    if(count ==  size)
    {
        copy(array, size);
        count++;
        array[count] = temp;
    }

}

void copy(int* &oldArr  , int size)
{
    int temp = size * 2;
    int *newArr = new int[temp];

    for (int i = 0; i < size; i++) 
    {
        newArr[i] = oldArr[i];

    }

    delete[] oldArr;
    oldArr = newArr;

【问题讨论】:

  • count = size 应改为 ==
  • @buc 很好,但它仍然没有增加数组的大小
  • 我刚注意到,又发现3个错误,看我的回答。
  • 您是否在add_element 之前声明了copy?如果不是,并且您之前还声明了 using namespace std(基于 cout 和 cin,看起来您已经声明了),那么您实际上可能在 add_element 中使用了 en.cppreference.com/w/cpp/algorithm/copy

标签: c++ arrays c++11 dynamic-arrays


【解决方案1】:

您的代码中有几个错误。

首先,在add_element 中,您想测试项目计数是否等于数组大小,但您不小心覆盖了count 变量:

if(count = size)   // this assigns count

应该替换为

if(count == size)

其次,你删除新分配的数组而不是旧的:

oldArr = newArr;
delete[] oldArr;    // this will effectively deallocate newArr

你应该改变这些行的顺序:

delete[] oldArr;    // it deletes oldArr
oldArr = newArr;    // and then points it to newArr

第三,将指针按值传递给数组。这样,当分配一个新数组时,您将无法将新数组的地址返回给函数的调用者。你应该通过引用传递数组指针,类似于count:

int add_element(int* &array, int size, int &count)

void copy(int* &oldArr, int size)

第四,您从函数add_element 返回两次count:既作为返回值,又作为输入输出参数。虽然,这在技术上不是问题,但绝对没有必要。我建议将add_element 更改为返回void

更新

最后,但并非最不重要的是,我忽略了第五个问题。与需要从函数返回新数组指针的方式类似,数组大小也必须这样做。所以size应该通过引用传递并且应该正确更新:

int add_element(int* &array, int &size, int &count)

void copy(int* &oldArr, int &size) {   // pass size by reference
    int temp = size * 2;

    // ...

    oldArr = newArr;
    size = temp;   // update size
}

【讨论】:

  • 嘿抱歉回复晚了...我继续进行了这些更改,但它似乎仍然没有更新我的数组的大小,我真的不知道为什么.....我继续对我的原始帖子进行了编辑
  • 我更新了我的答案,但此时您应该自己弄清楚:如果您想更改函数中的值,您必须返回它或通过指针或引用传递它。
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多