【发布时间】: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 是的,好点。如果您没有指向要插入的下一个或上一个项目的指针,那么您将不得不搜索它。
标签: c++ arrays visual-c++