调整c++数组的大小和复制

Posted

技术标签:

【中文标题】调整c++数组的大小和复制【英文标题】:Resize and copy of c++ array 【发布时间】:2012-10-02 12:51:36 【问题描述】:

例如,如果我有一个包含 5 个元素的指针数组(已满)并且我想在第二个位置插入另一个元素,我将不得不分配另一个数组(大小 + 1),从旧的复制第一个元素数组,插入新元素,然后复制剩余元素。此应用程序不能浪费任何空间。 这是到目前为止的代码:

Sometype **newArray=new Sometype*[++Count];
size_t s=sizeof(Array);
memcpy(newArray,Array,s*position);
newArray[position]=new Sometype();
memcpy(newArray+position+1,Array+position,s*(Count-position-1));

delete [] Array;
Array=newArray;

有没有更有效的方法来做这件事,因为这是我的应用程序的瓶颈?我是 C++ 新手,所以我不知道任何高级的东西。 矢量可以用于此目的吗? 我想我在某处读到它在调整大小时占用了以前使用的空间的两倍。 这是真的还是可以修改这种行为?

【问题讨论】:

如果您确实想尽量减少内存使用,请按照上面的建议使用 std::vector。它还将大大清理您的代码。如果您想避免所有复制,请使用 std::list ,它将快速插入而无需大量复制,但也会使用更多内存。不确定您是在说内存使用还是避免复制-您说“不能浪费任何空间”和“我的应用程序的瓶颈”-不确定您的意思是复制速度是瓶颈还是内存用法是。 @Nerdtron 我有内存限制,但复制速度是瓶颈 如果瓶颈是复制速度,那么可能 std::list 就是答案。它使用双向链表,因此您将在内存开销中为列表中的每个项目提供 2 个指针,但插入元素将是恒定时间,只需调整几个指针即可。 @Nerdtron:仅当您已经知道位置(即在该位置有一个迭代器)时,列表中的插入才是常数时间。如果您需要定位插入位置,它又是线性的,但缓存行为比数组差得多。 @molbdnilo 是的,好点。如果您没有指向要插入的下一个或上一个项目的指针,那么您将不得不搜索它。 【参考方案1】:

如果你不能浪费任何空间并且你必须坚持使用顺序容器,那么恐怕这是最有效的方法。但我仍然不相信您不能浪费任何空间。如果您可以提前预料到以后需要再添加 5 个元素,那么从一开始就调整数组的大小会更有效。在任何情况下,您都应该使用向量来避免这种糟糕的 C 风格代码,并且更清楚您的意图。您可能想看看std::vector<T>::reserve() 函数。向量在调整大小时是否采用先前的两倍未指定,并且因实现而异。

【讨论】:

【参考方案2】:

看看标准容器std::vectorstd::liststd::unordered_setstd::unordered_map

【讨论】:

以上是关于调整c++数组的大小和复制的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中动态调整数组的大小

在调整大小时禁用矢量填充值? C++

调整动态分配的指针数组的大小(复制构造函数不起作用?)

调整动态字符串数组的大小[关闭]

可以快速调整大小的数组

glibc 附带的 C 是不是有自动调整大小的数组/动态数组实现?