C/C++中内存的增量动态分配
Incrementally dynamic allocation of memory in C/C++
我有一个for循环,需要向矩阵中增量添加列。在进入for循环之前,行的大小是已知的,但列的大小取决于某些条件。以下代码说明了这种情况:
N = getFeatureVectorSize();
float **fmat; // N rows, dynamic number of cols
for(size_t i = 0; i < getNoObjects(); i++)
{
if(Object[i] == TARGET_OBJECT)
{
float *fv = new float[N];
getObjectFeatureVector(fv);
// How to add fv to fmat?
}
}
编辑1这就是我临时解决问题的方法:
N = getFeatureVectorSize();
float *fv = new float[N];
float *fmat = NULL;
int col_counter = 0;
for(size_t i = 0; i < getNoObjects(); i++)
{
if(Object[i] == TARGET_OBJECT)
{
getObjectFeatureVector(fv);
fmat = (float *) realloc(fmat, (col_counter+1)*N*sizeof(float));
for(int r=0; r<N; r++) fmat[col_counter*N+r] = fv[r];
col_counter++;
}
}
delete [] fv;
free(fmat);
然而,我仍在寻找一种在C/C++中增量分配二维数组内存的方法。
回答您最初的问题
//如何将fv添加到fmat?
当您使用float **fmat
时,您正在声明一个指向[指针数组]的指针。因此,你必须先分配(并释放!)该数组,然后才能使用它
float **fmat = new float*[N];
然后在你的循环中,你只需进行
fmat[i] = fv;
然而,我建议您考虑std::vector
方法,因为它不会明显变慢,并且会使您免受所有new
和delete
的影响。
更好-使用boost::MultiArray作为这里的首要答案:
如何在C/C++中最好地处理动态多维数组?
尝试动态地分配您自己的矩阵类型是不需要的。
或者,作为一种低技术、快速和肮脏的解决方案,使用矢量的矢量,比如:
向量的C++向量
如果您想在没有花哨数据结构的情况下实现这一点,您应该将fmat
声明为大小为N的指针数组。对于每一列,您可能需要先猜测一个合理的大小。动态分配一个浮动大小的数组,并将fmat
的适当元素设置为指向该数组。如果空间不足(如中所示,有更多的浮点值要添加到该列),请尝试分配一个大小是以前两倍的新数组。将fmat
的适当元素更改为指向新数组,并取消分配旧数组。
这种技术有点难看,如果你的预测不好,可能会导致很多分配/解除分配,但我以前也用过。如果您需要在不使用其他人的数据结构的情况下进行动态阵列扩展,这几乎是您所能得到的。
要详细说明std::vector
方法,它看起来是这样的:
// initialize
N = getFeatureVectorSize();
vector<vector<float>> fmat(N);
现在循环看起来是一样的,您通过说fmat[i]
来访问行,但是没有指向浮点的指针。您只需调用fmat[i].resize(row_len)
来设置大小,然后使用fmat[i][z] = 1.23
进行分配。
在你的解决方案中,我建议你让getObjectFeatureVector
返回一个vector<float>
,所以你可以只说fmat[i] = getObjectFeatureVector();
。多亏了C++11移动构造函数,这将和分配指针一样快。该解决方案还将解决CCD_ 15不知道阵列大小的问题。
编辑:据我所知,你不知道栏目的数量。没有问题:
deque<vector<float>> fmat();
给定此函数:
std::vector<float> getObjectFeatureVector();
这就是您添加另一列的方式:
fmat.push_back(getObjectFeatureVector());
列的数量为fmat.size()
,并且一列中的行的数量为fmat[i].size()
。
- 删除类成员的动态分配内存的最佳方法是什么
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为浮点数组动态分配内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 如何为const char double指针(使用新的)动态分配内存
- 在动态分配内存的同时,使用指定尺寸
- 动态分配内存
- 如何在我指向的安德烈斯上动态分配内存?
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 当动态分配内存时警告
- 为结构动态分配内存
- 动态分配内存,用于存储使用 WinHttpReadData 下载的 HTML 源代码
- 如何在C++中为灵活阵列动态分配内存
- 从C++中的文件读取时动态分配内存到结构
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 以C++为单位的动态分配内存的初始值
- 虚拟析构函数:如果基类动态分配内存,基类中是否需要它
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存