gpt4 book ai didi

C++动态分配数组

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:01 26 4
gpt4 key购买 nike

我正在做一些作业并卡在了这里。我正在尝试编写一个 list_add() 函数。它的第一个功能是向数组添加值。它的第二个功能是增加数组的大小。所以它的工作方式很像 vector 。我不知道我是否做对了。我尝试的是创建一个比旧数组大的新动态分配数组,然后将所有值复制到新数组。

这是正确的方法吗?

这是主体

int main()
{
const int N = 7;

//declaring dynamic array allocation
int* list = new int[N];

int used = 0, a_val;
for(int i=0;i<11;i++)
{
list_add(list, used, N, i);
}

cout << endl << "Storlek: " << N << endl << endl;
cout << "Printar listan " << endl;
for(int i=0;i<used;i++)
{
cout << list[i] << ". ";
}

}

这是函数

bool list_add(int *list, int& space_used, int max_size, int value)
{

if(max_size-space_used > 0)
{
*(list+(max_size-space_used-1)) = value;
space_used++;
return true;
}
else
{
cout << "Increasing size of array!" << endl;
int new_max_size = space_used+1;
delete [] list;
int *list_new = new int[new_max_size];

for(int i=0; i<new_max_size; i++)
{
list_new[i] = i;
cout << list_new[i] << ". ";
}
cout << endl;
space_used++;
list = list_new;
return false;
}
}

最佳答案

你的代码实现有四个问题:

  1. 它不复制列表的元素。
  2. 它没有将 new_list 的值赋给 main 中的 list 变量
  3. 它从后往前插入值,而不是在最后一个值之后
  4. max_size 不会更新。很容易忽略这一点,因为您每次只将数组的大小增加 1。这样每次添加值时都需要分配。如果您将新大小增加一个以上,它仍会每次都重新分配。

第一个问题可以通过更改 list_add 中的 for 循环来解决,因此它会生成一个拷贝:

for (int i = 0; i < space_used; i++) {   // this also changed.
list_new[i] = list[i];
cout ...
}
// insert the new value (in the front?)
list_new[max_size-space_used-1] = value;
delete [] list; // Delete the list afterwards instead of earlier.

第二个问题可以通过返回一个指向列表的指针来解决。将 main 函数更改为:

for (int i = 0; i < 11; i++) {
list = list_add(list, used, N, i);
}

第三个问题可以通过修改这一行来解决

list_new[max_size-space_used-1] = value;

list_new[space_used++] = value;

在此之后,您还应该删除 space_used++

要查看第四个问题,您应该更改此行

int new_max_size = space_used+1;

int new_max_size = space_used+3;

它仍然会每次重新分配。然而,它应该只重新分配两次。


这是完整的代码:

#include <iostream>
using std::cout;
using std::endl;

int* list_add(int *list, int& space_used, int& max_size, int value) {
if (max_size - space_used > 0) {
list[space_used++] = value;
return list;
}
else {
cout << "Increasing size of array!" << endl;
int new_max_size = space_used+1;

int *list_new = new int[new_max_size];

for (int i = 0; i < space_used; i++) {
list_new[i] = list[i];
cout << list_new[i] << ". ";
}
cout << endl;

list_new[space_used++] = value;
max_size=new_max_size;

delete [] list;
return list_new;
}
}

int main() {
int N = 7;

//declaring dynamic array allocation
int* list = new int[N];

int used = 0, a_val;

for (int i = 0; i < 11; i++) {
list=list_add(list, used, N, i);
}

cout << endl << "Storlek: " << N << endl << endl;
cout << "Printar listan " << endl;

for (int i = 0; i < used; i++) {
cout << list[i] << ". ";
}
}

关于C++动态分配数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1793590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com