C++ 插入到数组的中间

C++ 插入到数组的中间,c++,arrays,insert,variable-assignment,C++,Arrays,Insert,Variable Assignment,我有一个数组int*playerNum,它存储了球队中所有球员的名单。每个插槽,例如playerNum[1]表示团队中的一个职位,如果我想为团队中的一个新职位添加一名新球员。也就是说,将一个新元素插入数组中间附近的某个位置,我将如何执行此操作 此刻,我在想你memcpy到你想把播放器插入一个新数组的位置,然后插入新播放器并复制剩下的部分 (我必须使用数组)如果必须使用数组,在确保有足够的存储空间后(必要时使用realloc),使用memmove将项目从插入点移动到末端一个位置,然后将新播放器保存

我有一个数组
int*playerNum
,它存储了球队中所有球员的名单。每个插槽,例如
playerNum[1]表示团队中的一个职位,如果我想为团队中的一个新职位添加一名新球员。也就是说,将一个新元素插入数组中间附近的某个位置,我将如何执行此操作

此刻,我在想你
memcpy
到你想把播放器插入一个新数组的位置,然后插入新播放器并复制剩下的部分

(我必须使用数组)

如果必须使用数组,在确保有足够的存储空间后(必要时使用
realloc
),使用
memmove
将项目从插入点移动到末端一个位置,然后将新播放器保存在所需位置

如果源区域和目标区域重叠,则不能使用
memcpy


一旦数组中的对象有非平凡的复制构造函数,这将不是失败的,它不是习惯C++。使用容器类中的一个更安全(<代码> STD::vector 或 STD::清单)。

< P>如果您使用C++,我建议不要使用<代码> MeMCPY < /C> >或<代码> MimStest,而是使用<代码>拷贝< /> >或<代码> CopyOffeld算法。这些将适用于任何数据类型,而不仅仅是普通的旧整数,而且大多数实现都经过了充分优化,可以编译成
memmove
。更重要的是,即使您将数组中元素的基本类型更改为需要自定义复制构造函数或赋值运算符的类型,它们也会起作用。

您使用
memcpy
的解决方案是正确的(在其他人提到的一些假设下)

但是,因为你在C++中编程。使用它及其

insert
方法可能是更好的选择

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

> p>数组取一个连续的内存块,没有插入中间元素的函数。您可以创建一个比原始阵列大1的新阵列,然后将原始阵列复制到新阵列和新成员中

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];
}  

for(int i=0;i当您谈论数组和“插入”时,我假设它是一个排序数组。如果现有数组的容量
N
足够大,可以存储更多的条目(
N>N
,其中
N
是当前条目的数量),则不一定需要第二个数组。您可以将条目从
k
移动到
n-1
(零索引)到
k+1
n
,其中
k
是所需的插入位置。在索引位置
k
插入新元素,并将
n
增加一个。如果数组开始时不够大,您可以按照建议的方法,或者只需重新分配一个容量更大的新数组
n'
,然后进行复制应用上述实际插入操作之前的现有数据


:当你使用C++时,你可以很容易地使用<代码> STD::vector .< /P> < P>。尽管可以使用数组,但是C++有更好的解决方案。对于初学者,尝试<代码> STD::vector < /COD>,这是一个足够好的通用容器,基于一个动态分配的数组。它在很多情况下都像数组一样。p> 但是,看看您的问题,数组或向量有两个缺点:

  • 索引必须是基于0且连续的;您不能从中间删除元素,而不会丢失删除元素后所有内容的键/值关联;因此,如果您删除位置4上的播放机,则位置9上的播放机将移动到位置8
  • 随机插入和删除(即,除末端以外的任何位置)代价高昂-O(n),即执行时间随数组大小线性增长。这是因为每次插入或删除时,都需要移动数组的一部分

如果键/值对您来说并不重要,插入/删除也不是时间关键型的,并且您的容器永远不会太大,那么请务必使用向量。如果您需要随机插入/删除性能,但键/值并不重要,请查看
std::list
(虽然您不会获得随机访问,也就是说,
[]
操作符没有定义,因为实现它对于链表来说效率很低;链表也非常占用内存,每个元素的开销为两个指针)。如果您想维护键/值关联,
std::map
是您的朋友。

无论使用何种数据结构,都不要使用循环,请使用
std::copy
!如果(将来)var1在具有非平凡复制构造函数的类型上使用此代码,
memmove
(或
memcpy
)不起作用。不要查看
std::list
的性能。
std::list
是一个基于节点的容器,您可以使用自定义池分配器提高其性能,但最终它是大多数工作负载中速度最慢的非关联容器。
std::list
的优点包括:几乎没有迭代器失效和数据拼接
操作,但肯定不是通用性能(无论是速度还是内存占用…)好吧,如果随机插入和删除将成为瓶颈,那么
std::list
在性能方面仍然很有趣。理论上。实际上,遍历列表的成本(并获取所有缓存未命中,因为节点在内存中无处不在)内存位置在CS类中不常讨论,但在实践中它非常重要。
向量
具有非常简单的结构,可以很好地使用缓存,
memmove
非常有效。