C++ 向数组添加元素
Posted
技术标签:
【中文标题】C++ 向数组添加元素【英文标题】:C++ adding elements to an array 【发布时间】:2016-11-13 15:40:07 【问题描述】:这是我的编程课作业的一部分。老师希望我们创建几个函数,其中一个可以将元素添加到现有的动态结构数组中,这就是我遇到的麻烦。
根据我在网上找到的不同帖子,这是我对函数应该如何工作的理解:
创建一个比现有数组更大的新数组
将旧数组的内容复制到新数组中
将新元素添加到新数组中
销毁旧数组
但是,出了点问题,程序崩溃了 - 我认为问题在于我尝试执行第 3 点和第 4 点的方式。有人可以看看吗?我真的很感激任何帮助。
编辑:忘了说,老师希望函数设置为 void,它们应该不返回任何东西。
代码如下:
const int size = 2;
struct Player
string name;
string kind;
;
void addplayer(Player * plarr, int size)
cout << "Adding a new element to the array" << endl << endl;
//creating a new, bigger array:
Player * temp = NULL;
temp = new Player[size+1];
//copying the content of the old array
for (int i=0;i<size;i++)
temp[i].name = plarr[i].name;
temp[i].kind = plarr[i].kind;
//adding the new element:
string name, kind;
cout << "Choose the name for the new player: " << endl;
cin >> name;
cout << "Choose the class for the new player: " << endl;
cin >> kind;
temp[size+1].name = name;
temp[size+1].kind = kind;
//deleting the old array, replacing it with the new one
delete[] plarr;
plarr = temp;
【问题讨论】:
为什么不使用std::vector
- 辛苦了!
@EdHeal 老师禁止了,很遗憾
@EdHeal:对于动态分配的工作原理,这不会非常有指导意义吧?
不是你的问题,但从长远来看,如果你使用size_t
而不是int
作为数组大小,事情会更容易。它与 C++ 的其他部分更兼容。
还要看看 RAII。在这种情况下,您可以构建一个 Player_array 类来在销毁时自动管理和删除数组。
【参考方案1】:
void addplayer(Player * plarr, int size)
plarr
参数按值传递。
这个函数似乎分配了一个新数组并正确复制了内容,除了一个错误:
temp[size+1].name = name;
temp[size+1].kind = kind;
这里的索引应该是size
。但最大的错误是函数的结尾是:
delete[] plarr;
plarr = temp;
不幸的是,由于plarr
是按值传递的,所有这一切只是将这个函数的plarr
参数设置为新指针,然后返回。
它什么也没做,因为这个函数的调用者仍然有它原来的指针。现在被销毁了。
您应该将此函数更改为 return
新指针,调用者需要保存它,而不是原来的指针。
【讨论】:
很遗憾,老师希望我们编写不返回任何内容的函数。换句话说,它们都应该有 void 类型 - 抱歉,我可能应该在我的问题中提到这一点 :( 非常感谢你的帮助! 如果 OP 返回新指针的值,则调用必须变为plarr = newPlayer(plarr, size++);
。就个人而言,我会通过引用传递指针和的大小,在函数中增加大小,所以声明是void newPlayer( Player*&plarr, size_t &size)
。
如果你不称职的老师想让你写出糟糕的代码,你唯一的选择就是通过引用而不是值来传递参数。
是的,通过引用有效,非常感谢大家!以上是关于C++ 向数组添加元素的主要内容,如果未能解决你的问题,请参考以下文章