我需要在C ++中执行以下C#代码的等效操作
Array.Resize(ref A, A.Length - 1);
如何在C ++中实现这一目标?
答案 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;
}
答案 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)
std::vector
或答案 3 :(得分:1)
答案 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之一。