C++ 有效调整动态数组的大小
我有一个动态数组作为我的类的成员。我正试图找到一种有效的方法来调整它的大小,并将所有信息保存在其中。我知道向量可以很好地解决这个问题,但我想用一个动态数组来代替 我的类有一个称为data的类型为unsigned\u int8的动态数组 以下情况是否可以接受C++ 有效调整动态数组的大小,c++,dynamic-arrays,C++,Dynamic Arrays,我有一个动态数组作为我的类的成员。我正试图找到一种有效的方法来调整它的大小,并将所有信息保存在其中。我知道向量可以很好地解决这个问题,但我想用一个动态数组来代替 我的类有一个称为data的类型为unsigned\u int8的动态数组 以下情况是否可以接受 unsigned _int8 * temp = data; data = new unsigned _int8[NewSize](); if(OldSize >= NewSize) { for(int i = 0; i <
unsigned _int8 * temp = data;
data = new unsigned _int8[NewSize]();
if(OldSize >= NewSize)
{
for(int i = 0; i < NewSize; i++)
data[i] = temp[i];
}
else
{
for(int i = 0; i < OldSize; i++)
data[i] = temp[i];
}
delete [] temp;
unsigned\u int8*temp=数据;
数据=新的无符号_int8[NewSize]();
如果(旧尺寸>=新尺寸)
{
对于(int i=0;i
还是我应该用另一种方式?有什么建议吗
编辑
修复了示例中的一个错误,并将char更改为unsigned _int8
编辑2
我不会经常重新分配,如果有的话。我希望该功能能够避免编写代码来创建新对象,并在需要时复制所有内容
我正在编写的类用于创建和保存位图(.bmp)图像。数组只保存文件字节。创建对象时将(应该)知道图像大小。由于数组使用的是类型,因此可以使用
memcpy()
替换循环:
unsigned _int8 *temp = new unsigned _int8[NewSize];
if (OldSize >= NewSize)
memcpy(temp, data, NewSize * sizeof(unsigned _int8));
else
{
memcpy(temp, data, OldSize);
memset(&temp[OldSize], 0, (NewSize-OldSize) * sizeof(unsigned _int8));
}
delete[] data;
data = temp;
或者至少使用std::copy()
(对于POD类型,std::copy()
类似于memcpy()
,但对于非POD类型,它使用循环,因此保留对象分配语义):
也就是说,您确实应该使用
std::vector
。它为您处理这些细节。这种类型的数组管理是C中必须使用的,但在C++中不应该使用,如果使用它,请使用本机C++功能。< /P> < P>这样做,每次添加一个新的元素到数组时,必须调整大小。
调整大小操作为Θ(n),因此插入操作也变为Θ(n)
通常的做法是,每次调整数组大小时,都要复制(或复制三次等)数组大小,这样调整大小操作仍然是Θ(n),但摊销插入成本是Θ(1)
此外,通常容量与大小分开,因为容量是实现细节,而大小是阵列接口的一部分
当移除元素时,您可能需要验证容量是否过大,如果是,则减小容量,否则,一旦容量变大,该空间将永远不会被释放
您可以在此处查看更多信息:
这种方法的问题在于,您需要将大小调整到所需的大小。这意味着,当您插入新元素时,所需的时间变化很大 例如,如果你一直在做一个类似“push_back”的操作,那么你会一直重新分配 另一种想法是分配额外的大小,以避免频繁的重新分配,这会在性能方面花费很多 例如,Vector分配额外的大小以具有摊销的Redimensioning常量 这里有一个详细的链接 stl中的矢量使用这种方法更有效
看起来您正在尝试重新实现
std::vector
。只需使用std::vector
<代码>标准::复制您缺少一个++i
在第二个循环中;)如果您真的不想使用std::vector或等效工具,那么您可以回到C,特别是考虑到这是一个简单的字符数组。对原始字符数组使用malloc(),然后在需要调整其大小时使用realloc()。该数组实际上是无符号的_int8。这有什么变化吗?没有。我所说的一切也适用于该类型,只要根据需要将char
替换为uint8
。我不知道除此之外,向量是否还有我需要的任何功能。我想避免添加任何我不需要的内容。此外,这对我来说是一次学习经历。我越依赖于库,我就越不了解C++。谢谢你的帮助。这个练习教你C,而不是C++。如果你真的想学习C++,那么学习C++,包括C++所提供的C不一样(就像STL库,它是C++的本地部分)。你个人是否总是使用向量代替动态数组?只是好奇。我从来没有在专业环境中使用过C++,所以我不知道什么是标准。对不起,我应该在我的问题中提供更多的信息。你说的每一句话都是正确的,也是很好的建议,但是对于我的问题,我认为雷米·勒博有一个更好的答案。对不起,我应该在我的问题中提供更多的信息。你说的每一句话都是正确的,也是很好的建议,但对于我的问题,我认为雷米·勒博有一个更好的答案。另外,向量很好,我以前已经用过好几次了。我不认为他们有任何功能,我需要除了这个,但我想避免添加任何我不需要的项目。好的,当然,所以你也应该投票支持他的答案,给他额外的分数。单击0旁边的向上箭头,您可以看到接近他的答案
unsigned _int8 *temp = new unsigned _int8[NewSize];
if (OldSize >= NewSize)
std::copy(data, &data[NewSize], temp);
else
{
std::copy(data, &data[OldSize], temp);
std::memset(&temp[OldSize], 0, (NewSize-OldSize) * sizeof(unsigned _int8));
}
delete[] data;
data = temp;