如何将动态内存分配的数组调整为特定值?
Posted
技术标签:
【中文标题】如何将动态内存分配的数组调整为特定值?【英文标题】:How to resize an dynamic memory allocated array to a specific value? 【发布时间】:2011-09-21 06:45:15 【问题描述】:所以我有一个名为 digits 的数组,它具有动态分配的内存。初始容量设置为默认容量 20。我试图弄清楚如何实现以下代码,以便如果将某些内容添加到超过容量的数组中,代码将创建一个 2^n 的新数组更大(即 40、80、160)。但是我希望它有一个 for 循环,这将使数组 2^n 更大,直到新容量大于输入的容量。
void BigNum::resize(size_t n)
size_t *NEW_CAPACITY;
if(n == capacity)
return; // The allocated memory is already the right size
if(n < used)
n = used;
NEW_CAPACITY = new size_t[n];
copy(digits, digits + used, NEW_CAPACITY);
delete[] digits;
digits = NEW_CAPACITY;
capacity = n;
非常感谢任何帮助
【问题讨论】:
你为什么不用std::vector
您不使用 std::vector
的任何具体原因,它会自动执行类似的操作吗?
因为我必须以这种方式处理它,这是一个要求。我所写的基本上就是我想要做的我只需要一个 for 循环来调整 NEW_CAPACITY 数组,直到它比输入的更大。我需要弄清楚如何在每个循环上使数组大小 2^n 更大
【参考方案1】:
如果您使用 C++ 语法编写 C 代码 - 请使用 C 方法:realloc
和 malloc
。
如果您正在编写 C++ 代码 - 使用 std::vector
而不是数组。
您所指的循环是一个简单的计算:
while(current<required)
current = 2*current;
new_digits = realloc(digits, current);
// check that the allocation succeeded, handle errors, no need
// to copy data - realloc does that for you.
完成。
【讨论】:
我必须使用数组作为项目的一部分。我想弄清楚的是,如果数组的每个部分对应于较大数字的一个数字并且该较大数字超过默认容量 20,则用于处理大量数字。那么数组的大小应调整为 2^n默认直到新容量大于大数 为什么在循环内调用realloc
?此外,您编写它的方式使得无法从 realloc
的失败中恢复(如果 realloc
失败,digits
的旧值将丢失并且您会出现泄漏)。
@Idelic - 虽然我通常会像这样解雇迂腐的 cmets,但在我看来,OP 无能为力,只能复制我的示例,所以我会更正它。
@Sean,如果一个句子需要 3 行,那么很可能没有人会明白你想说什么。【参考方案2】:
“我试图弄清楚如何实现以下代码,以便如果将某些内容添加到超出容量的数组中,代码将创建一个大 2^n 的新数组(即 40, 80, 160)。但是我希望它有一个 for 循环,这将使数组 2^n 更大,直到新容量大于输入的容量。”
首先,我认为您的意思是 2*n 而不是 2^n。
其次,为什么不像其他评论者所说的那样使用 std::vector?
第三,我不完全理解你的问题,但听起来你想要这个:
int newCapacity = capacity;
while( newCapacity < n )
newCapacity *= 2;
不过,这似乎很琐碎,所以您能澄清一下您的问题吗?
【讨论】:
以上是关于如何将动态内存分配的数组调整为特定值?的主要内容,如果未能解决你的问题,请参考以下文章