我的C ++算法获取大小未知的数据(它逐个检测图像上的粒子,我不知道在此算法完成其工作之前将检测到多少粒子)。 所以,首先我要分配具有10000个元素的数组,并在处理过程中,如有必要,多次分配另外10000个元素。
这是我尝试的,它不起作用:
#include <iostream>
using namespace std;
int main(){
int n = 3;
int m = 3;
float *a = new float[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
float *b = a + 2;
b = new float[3];
b[0] = 4;
b[1] = 5;
cout << a[3] << endl;
}
结果,我得到负无穷大。当然,我可以在不同的数组中处理这个,我可以分配一次大量的内存。我之后需要将完整的检测数据传递给函数,因此,我希望有一个大数组。
但是,有没有办法增加动态分配方式的大小?在玩具示例中我想要的是将数组a
中的元素数量增加3,因此它将具有6
个元素。
在Matlab中绝对有可能。那么C ++呢?
由于
答案 0 :(得分:8)
您应该使用std::vector
而不是原始数组。它被实施以有效地增长。您可以使用resize
更改其大小,使用push_back
附加到其中,或者使用insert
插入范围(或其他各种内容)以使其增长。
在C ++中无法更改手动分配的数组的大小。一般来说,在原始数组上使用std::vector
是一个好主意,即使大小没有改变。一些论点是自动化,防漏内存管理,额外的异常安全以及vector
知道自己的大小。
答案 1 :(得分:5)
不,你不能增加数组的大小。如果要使用数组,则必须为整个新数组分配一个足够大的新块,并在删除旧数组之前复制现有元素。或者您可以使用更复杂的数据结构,而不会连续存储其元素。
幸运的是,标准库有容器可以自动处理;包括vector
,一个可调整大小的数组。
std::vector<float> a(3);
a[0] = 0;
a[1] = 1;
a[2] = 2;
// you can resize it by specifying a new size
a.resize(4);
a[3] = 3;
// or by appending new elements
a.push_back(4);
答案 2 :(得分:0)
您应该在必要时使用vector
然后使用resize
或让它自行增长。
当你这样做时:
float *b = a + 2;
b = new float[3];
分配的内存不会连续分配给第一个分配,即使您之前将指针设置为指向末尾(无论如何都会被覆盖)。因此,当访问a[3]
时,您就会越界。