Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效调整动态数组的大小_C++_Dynamic Arrays - Fatal编程技术网

C++ 有效调整动态数组的大小

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 <

我有一个动态数组作为我的类的成员。我正试图找到一种有效的方法来调整它的大小,并将所有信息保存在其中。我知道向量可以很好地解决这个问题,但我想用一个动态数组来代替

我的类有一个称为data的类型为unsigned\u int8的动态数组

以下情况是否可以接受

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;