更改数组大小 C++

问题描述 投票:0回答:4

我创建了一个数组指针作为全局变量,如下所示:

T *bag;
        bag = new T[size];

我有一个方法可以将东西插入数组;但是,如果它检测到它会溢出数组,我需要调整数组的大小(没有向量)。我一直在阅读有关堆栈溢出的这个问题,但答案似乎并不适用于我,因为我需要将旧数组中的数据复制到新数组中。此外,如果我在方法内创建一个更大的新数组,然后将数据复制到新数组,一旦方法结束,该数组就会消失,但我需要它再次成为一个全局变量,所以我的所有方法可以看到它...我应该如何进行? 谢谢

c++ arrays pointers resize
4个回答
4
投票

要调整数组的大小,您必须分配一个新数组并将旧元素复制到新数组,然后删除旧数组。

T * p_bag;
p_bag = new T[old_size];
//...
T * p_expanded_bag = new T[new_size];
for (unsigned int i = 0; i < old_size; ++i)
{
  p_expanded_bag[i] = p_bag[i];
}
delete[] p_bag;
p_bag = p_expanded_bag;

您可以使用

std::copy
而不是
for
循环。


4
投票

new
分配的内存不会在你的方法结束后消失。

您可以使用引用返回指向新数组的指针:

void f(int *&ptr, size_t &size)
.

另外请注意,使用后需要手动清空内存。例如:

int* newArray = new int[newSize];
// copying from old array:
int* temp = oldArray;
oldArray = newArray;
delete[] temp;

0
投票

你需要的

thing
可以做以下事情

  • 当请求的大小大于当前数组大小时,自动处理大小调整。

  • 调整大小时,他们可以将原始内容复制到新空间,然后立即删除旧分配。

  • 有一个非全局变量的方式机制,他们可以跟踪数组指针和当前大小。

thing
std::vector
非常相似。如果不允许使用,您可能需要自己管理动态分配的资源,如
std::vector
。您可以在该答案链接中引用实现。

如果最终你需要将它包装在一个类中,请确保遵循三大规则(C++11 中的 5 条规则)


-1
投票

如果你有字符数组/整数/双精度数组,你可以使用 c 中的 realloc ...... http://www.cplusplus.com/reference/cstdlib/realloc/

bag = (T*) realloc(bag, new_size * sizeof(T));

Realloc 自动为新数组分配空间(可能分配到内存中的同一位置)并从给定数组中复制所有数据。 “内存块的内容将保留为新旧大小中较小的一个,即使该块已移动到新位置。”

例子:

#include <stdio.h>      /* printf*/
#include <stdlib.h>     /* realloc, free */

#include <iostream>

int main()
{
    int old_size = 5;
    int new_size = 10;

    int *array = new int[old_size];

    printf("Old array\n");
    for (int i=0; i<old_size; i++) {
        array[i] = i;   
        printf("%d ", array[i]);
    }
    printf("\nArray address: %d\n", array);

    array = (int*) realloc(array, new_size * sizeof(int));

    printf("New array\n");
    for (int i=0; i<new_size; i++)
        printf("%d ", array[i]);
    printf("\nArray address: %d\n", array);

    free(array);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.