插入数组的中间

时间:2011-09-01 05:47:30

标签: c++ arrays insert variable-assignment

我有一个数组int *playerNum,它存储了团队中所有玩家数量的列表。如果我想为团队中的新职位添加新玩家,则每个位置playerNum[1];代表团队中的位置。也就是说,在中间附近的某个地方插入一个新元素,我该如何做呢?

目前,我在想你memcpy你想要将玩家插入一个新阵列的位置,然后插入新玩家并复制其余部分?

(我必须使用数组)

6 个答案:

答案 0 :(得分:3)

如果您 使用数组,在确保您有足够的存储空间后(必要时使用realloc),请使用memmove从插入中移动项目指向一个位置的结尾,然后将新玩家保存在所需位置。

如果源和目标区域重叠,则无法使用memcpy

只要数组中的对象具有非平凡的复制构造函数,它就会失败,并且它不是惯用的C ++。使用其中一个容器类更安全(例如std::vectorstd::list)。

答案 1 :(得分:3)

如果您使用的是C ++,我建议您不要使用memcpymemmove,而应使用copycopy_backward算法。这些将适用于任何数据类型,而不仅仅是普通的旧整数,并且大多数实现都已经过充分优化,无论如何它们都将编译为memmove。更重要的是,即使您将数组中元素的基础类型更改为需要自定义复制构造函数或赋值运算符的内容,它们也能正常工作。

答案 2 :(得分:1)

使用memcpy的解决方案是正确的(在其他人提及的几个假设下)。

但是,因为你是用C ++编程的。使用std::vector及其insert方法可能是更好的选择。

  vector<int> myvector (3,100);
  myvector.insert ( 10 , 42 );

答案 3 :(得分:0)

数组采用连续的内存块,没有功能可以在中间插入一个元素。您可以创建一个大于原点的新大小,然后将原始数组复制到新数组加上新成员

for(int i=0;i<arSize/2;i++)
{
    newarray[i]<-ar[i];
}
newarray[i+1]<-newelemant;
for(int j=i+1<newSize;j++,i++)
{
    newarray[i]<-ar[i];
}  

如果你使用STL,ting变得更容易,请使用list。

答案 4 :(得分:0)

当你在谈论数组和“插入”时,我认为它是一个排序数组。如果现有阵列的容量N足够大以存储更多条目(N>n,其中n是当前条目的数量),则不一定需要第二个阵列。您可以将条目从k移至n-1(零索引)至k+1n,其中k是所需的插入位置。将新元素插入索引位置k并将n增加1。如果数组在开始时不够大,您可以按照提议的方法或仅重新分配更大容量N'的新数组,并在应用上述实际插入操作之前复制现有数据。

BTW:当您使用C ++时,您可以轻松使用std::vector

答案 5 :(得分:0)

虽然可以为此使用数组,但C ++提供了更好的解决方案。对于初学者,请尝试std::vector,这是一个足够好的通用容器,基于动态分配的数组。在许多情况下,它的行为与数组完全相同。

然而,看看你的问题,数组或向量有两个缺点:

  • 指数必须基于0并且是连续的;你不能从中间删除元素而不会丢失删除元素后的所有内容的键/值关联;因此,如果您移除位置4上的玩家,则位置9的玩家将移动到位置8
  • 随机插入和删除(即除了结尾之外的任何地方)都很昂贵 - O(n),即执行时间随着数组大小线性增长。这是因为每次插入或删除时,都需要移动数组的一部分。

如果键/值对你不重要,插入/删除不是时间关键,你的容器永远不会真的很大,然后一定要使用矢量。如果您需要随机插入/删除性能,但键值/值不重要,请查看std::list(尽管您不会获得随机访问权限,即[]运算符isn' t定义,因为实现它对于链表是非常低效的;链表也非常需要内存,每个元素有两个指针的开销。如果您想维护键/值关联,std::map是您的朋友。