C/C++中内存的增量动态分配

Incrementally dynamic allocation of memory in C/C++

本文关键字:动态分配 内存 C++      更新时间:2023-10-16

我有一个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方法,因为它不会明显变慢,并且会使您免受所有newdelete的影响。

更好-使用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()