【问题标题】:How do I allocate size for a dynamic array in c++?如何在 C++ 中为动态数组分配大小?
【发布时间】:2016-01-31 20:23:35
【问题描述】:

所以我用 C++ 编写了一个方法,在该方法中删除了数组中的一系列元素。问题是这是一个动态数组,数组的大小必须始终是一定的大小。因此,如果我从数组中删除了很多元素并留下至少 5 个空格,那么我需要删除这 5 个空格。我已经写了一个类似的方法来删除一个元素。这是检查是否有太多空间的行:

if (size - 1 == allocated_size - BLOCK_SIZE){

其中 size 是数组中元素的数量,allocated_size 是数组中有多少空间,BLOCK_SIZE 是 5。所以使用我的其他删除方法,我需要进行类似的检查,但是如果我有一个数组15 个元素,我删除了 10 个元素。然后我必须删除数组中的 10 个空格,但我不知道该怎么做。这是我现在拥有的:

if (size - range <= allocated_size - BLOCK_SIZE){
            try {
                new_array = new int[allocated_size - BLOCK_SIZE];
            } catch (bad_alloc){
                throw exception (MEMORY_EXCEPTION);
            }

其中 range 是我要删除的元素的数量。我的理论是,也许我可以创建另一个变量,当我声明数组时,我说allocated_size - BLOCK_SIZE * n 所以如果我需要删除10个空格,那么n就是2。问题是我在实现它时遇到了麻烦。

【问题讨论】:

  • an array of 15 elements and I remove 10 elements......if I need to remove 10 spaces then n would be 2 。所以 15 -10 = 2 ?我没想到。
  • 不,这不是我要说的。这两个来自我必须删除的内存量。因此,如果我需要释放 10 个内存块,那么我将使用 BLOCK_SIZE * 2 等于 10,因为 BLOCK_SIZE 是 5 所以 5 * 2 = 10。我遇到的问题是告诉程序我们需要释放 10 个块的记忆。你现在明白我在问什么了吗?
  • 基本上我会检查我必须释放多少空间。如果我必须释放 5 个空间,则 n 将为 1。如果我必须释放 10 个空间,则 n 将为 2。如果我必须释放 15 个空间,则 n 将为 3。原因是因为 BLOCK_SIZE 设置为5,该变量将始终为 5。因此 5 * 3 将是 15。与 20 相同。5 * 4 是 20,所以如果我想删除 20 个空格,那么 n 将是 4。我想我不能再解释清楚了不止于此。

标签: c++ arrays memory size allocation


【解决方案1】:

你能用一些 int 算术吗,

数组中的空槽数为:

int empty_slots = allocated_size - size;  

空块数为:

int empty_blocks = empty_slots / 5; 

整数除法会截断,因此对于 0 - 4 个空插槽,您将有 0 个空块,对于 5-9 个空插槽,您将有 1 个空块等...

但是您真的不想知道要制作多大的新阵列吗?那不会总是大小,所以:

int blocks_need = size / 5;                // truncates 
if (size % 5 > 0) {
    blocks_need = blocks_needed + 1;   // add a block if needed
}   
new_array = new int[blocks_needed * 5]; 

如果你想在你的阵列中增加一些额外的容量,或者大小 + 额外的容量。

【讨论】:

  • new_array 的一点是,allocated_size 必须始终是 5 的倍数。
  • 好的,所以再做一些数学运算,blocks_needed = size / 5;另外,如果在将 size 除以 5 时还有余数,您将需要多一个块,因此 if (size % 5) 向 blocks_needed 添加一个
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2011-03-15
  • 2020-11-26
相关资源
最近更新 更多