c++ - memcpy vector ?

标签 c++ c arrays vector

我有一段C代码:

mel[i] = malloc(sizeof(double)*mellength[i]);           
memcpy(mel[i],&temp[melstart[i]],mellength[i]*sizeof(double));

我将其转换为 C++ 并使用 vector 而不是数组:

vector< vector< double > > mel; // 2D vector

mel[i].resize(mellength[i]);

我有一个名为“temp”(一维)的数组,我想将“temp”中的所有元素复制到 vector mel 中。我已经尝试过:

for(int k=0; (k < mellength[i]); k++)
{
    mel[i][k] = temp[i];
    cout << mel[i][k] << endl;
}

但是saldy它不起作用,只是打印出不应该存在的值。如果您想深入了解我正在尝试做的事情,我已经包含了 C 函数以及下面的 C++ 函数。

C 函数:

void Setup_Mel(int fft_size, int sample_rate) {
    int i,j,k,tap;
    double fmax;
    double dphi;
    double fsample;
    double freq;
    double temp[fft_size/2];

    fmax=2595*log10(8000.0f/700+1);
    dphi = fmax/17;
    freq = (double)sample_rate/fft_size;


    for (i=0; i<16; i++) {
            melstart[i]=fft_size/2;
            mellength[i]=0;
            memset(temp,0,sizeof(double)*fft_size/2);
            for (j=0; j<fft_size/2; j++) {
                    fsample = 2595*log10(freq*j/700 + 1);

                    if ((dphi*i <= fsample) && (fsample < dphi*(i+1))) temp[j] = (fsample-dphi*i)/(dphi*(i+1)-dphi*i);
                    if ((dphi*(i+1) <= fsample) && (fsample < dphi*(i+2))) temp[j] = (fsample-dphi*(i+2))/(dphi*(i+1)-dphi*(i+2));
                    if ((temp[j] != 0) && (melstart[i] > j)) melstart[i] = j;
                    if (temp[j] != 0) mellength[i]++;
            }
            mel[i] = malloc(sizeof(double)*mellength[i]);           
            memcpy(mel[i],&temp[melstart[i]],mellength[i]*sizeof(double));
  //              for (k=0; k<mellength[i]; tap++,k++) printf("mel filter: %d, %d, %d, %f,  %f\n",i,melstart[i]+k,tap,mel[i][k],(melstart[i]+k)*freq);
    }
}

C++ 代码:

void setUp_Mel(int fft_size, int sample_rate, vector< vector< double > > &mel, int *melstart, int *mellength)
{
    double fmax;
    double dphi;
    double fsample;
    double freq;
    double temp[fft_size/2];

fmax = 2595*log10(8000.0f/700+1);
dphi = fmax / 17;
freq = (double)sample_rate/fft_size;

  for(int i=0; (i < 16); i++)
  { 
      melstart[i] = fft_size/2;
      mellength[i] = 0;
      double temp[fft_size/2];
      //double *temp = new double[fft_size/2];

      for(int j=0; (j < fft_size/2); j++)
      {
          fsample = 2595*log10(freq*j/700 + 1);

          if ((dphi*i <= fsample) && (fsample < dphi*(i+1)))
          {
             temp[j] = (fsample-dphi*i)/(dphi*(i+1)-dphi*i);
          }

          if ((dphi*(i+1) <= fsample) && (fsample < dphi*(i+2))) {

              temp[j] = (fsample-dphi*(i+2))/(dphi*(i+1)-dphi*(i+2));
          }

          if ((temp[j] != 0) && (melstart[i] > j))
          {
              melstart[i] = j;
          }

          if (temp[j] != 0) mellength[i]++;

      }
      mel[i].resize(mellength[i]);

      for(int k=0; (k < mellength[i]); k++)
      {
          mel[i] = temp[i];
      }

  }
}

最佳答案

首先,您需要确保外部 vector 具有正确的大小。

vector< vector< double > > mel; // 2D vector
mel.resize( numberOfArrays );

然后你可以使用assign成员函数来进行复制:

mel[i].assign( temp, temp + mellength[i] );

如果这不起作用,那么 vector 就不是问题。

<小时/>

无论如何,查看您的 C++ 函数,我没有看到您首先发布的代码。我看到这个:

  mel[i].resize(mellength[i]);

  for(int k=0; (k < mellength[i]); k++)
  {
      mel[i] = temp[i];
  }

使用i作为迭代器而不是k(除其他外)。这不会复制临时数组。它甚至不应该编译。

关于c++ - memcpy vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866032/

相关文章:

c++ - 对于 c++ 的 makefile 来说,一切都是明确的吗?

c++ - 运行给出错误的数字,但调试效果很好?

arrays - C中的指针数组,易于迭代

c++ - 套接字编程中非法查找的可能原因

python - 如何构造一个适合 numpy 排序的数组?

c++ - 在类外调用的私有(private)函数成员

c++ - 流插入结合后缀运算符

c - MISRA C 2012 - 规则 21.1 - 以下划线开头的宏

c++ - 如何将零大小的数组传递给模板函数

C 动态 3D 阵列存储器