如何在C ++中调整数组大小?

时间:2010-09-20 08:15:44

标签: c++

  

可能重复:
  Can you resize a C++ array after initialization?

我需要在C ++中执行以下C#代码的等效操作

Array.Resize(ref A, A.Length - 1);

如何在C ++中实现这一目标?

6 个答案:

答案 0 :(得分:34)

您无法调整数组大小,您只能分配新的数组(具有更大的大小)并复制旧数组的内容。 如果您不想使用std::vector(出于某种原因),请输入以下代码:

int size = 10;
int* arr = new int[size];

void resize() {
    size_t newSize = size * 2;
    int* newArr = new int[newSize];

    memcpy( newArr, arr, size * sizeof(int) );

    size = newSize;
    delete [] arr;
    arr = newArr;
}

代码来自此处http://www.cplusplus.com/forum/general/11111/

答案 1 :(得分:30)

在C ++中,数组的大小是静态的。您无法动态调整大小。这就是std::vector的用途:

std::vector<int> v; // size of the vector starts at 0

v.push_back(10); // v now has 1 element
v.push_back(20); // v now has 2 elements
v.push_back(30); // v now has 3 elements

v.pop_back(); // removes the 30 and resizes v to 2

v.resize(v.size() - 1); // resizes v to 1

答案 2 :(得分:3)

  1. 使用std::vector
  2. 编写自己的方法。使用new分配大块内存。使用该内存,您可以扩展到内存块的限制。

答案 3 :(得分:1)

原始数组在C ++中无法调整大小。

你应该使用类似Vector类的东西,它允许调整大小..

std::vector允许您调整大小,并允许在添加元素时动态调整大小(通常会在添加时不需要手动调整大小)。

答案 4 :(得分:0)

你不能这样做,请参阅this question的答案。 你可以改用std:vector。

答案 5 :(得分:0)

您可以对一维阵列执行类似的操作。这里我们使用int *&,因为我们希望我们的指针是可变的。

#include<algorithm> // for copy

void resize(int*& a, size_t& n)
{
   size_t new_n = 2 * n;
   int* new_a = new int[new_n];
   copy(a, a + n, new_a);
   delete[] a;
   a = new_a;
   n = new_n;
}

对于2D阵列:

#include<algorithm> // for copy

void resize(int**& a, size_t& n)
{
   size_t new_n = 2 * n, i = 0;
   int** new_a = new int* [new_n];
   for (i = 0; i != new_n; ++i)
       new_a[i] = new int[100];
   for (i = 0; i != n; ++i)
   {
       copy(a[i], a[i] + 100, new_a[i]);
       delete[] a[i];
   }
   delete[] a;
   a = new_a;
   n = new_n;
}

调用一维数组:

void myfn(int*& a, size_t& n)
{
   // do smth
   resize(a, n);
}

调用2D数组:

void myfn(int**& a, size_t& n)
{
   // do smth
   resize(a, n);
}

此函数的定义应早于myfn之一。