使用memcpy将vector <double>的内容复制到内存缓冲区</double>

时间:2014-03-24 06:31:03

标签: c++

我有一个包装矢量的类:

template <typename T>
class PersistentVector
{
  private:
    std::vector<T> values;
  public:
    std::vector<T> & getValues() throw () { return values; }
....
}

实例是:

PersistentVector<double> moments;

我正在尝试将所有双打的副本复制到其他人分配的缓冲区中。这是我创建缓冲区的地方:

// invariant: numMoments = 1
double * data_x = new double[numMoments];

这是我尝试将向量的内容复制到缓冲区中:

double theMoment = moments.getValues()[0];
// theMoment = 1.33

std::memcpy(
  data_x, 
  &(moments.getValues().operator[](0)), 
  numMoments * sizeof(double));
// numMoments = 1

double theReadMoment = data_x[0];
// theReadMoment = 6.9533490643693675e-310

如您所见,我从缓冲区获取垃圾值。为什么会这样?

工作解决方案

使用std::copy(感谢WhozCraig)

double theMoment = moments.getValues()[0];
// theMoment = 1.33

std::copy(moments.getValues().begin(), moments.getValues().end(), data_x);

double theReadMoment = data_x[0];
// theReadMoment = 1.33

解决方案失败

尝试使用data()代替operator[]()

double theMoment = moments.getValues()[0];
// theMoment = 1.33 

std::memcpy(
  data_x, 
  moments.getValues().data(),
  numMoments * sizeof(double));
// numMoments = 1

double theReadMoment = data_x[0];
// theReadMoment = 6.9533490643693675e-310

仍然很好奇为什么我的原始代码失败了!

1 个答案:

答案 0 :(得分:7)

我尝试用3种不同的方式做到这一点,所有这些都有效。 data()方法是正确的方法。 如果它不起作用 - 检查数据是否以某种方式被破坏。

 std::vector<double> vec1 = {1.33,2.66,3.99};
 double* vec2 = new double[3];

 int numMoments = 1;

 ::memcpy(
  vec2, 
  vec1.data(),
  numMoments * sizeof(double));

 ::memcpy(
  vec2, 
  &(*vec1.begin()),
  numMoments * sizeof(double));

 ::memcpy(
  vec2, 
  &(vec1[0]),
  numMoments * sizeof(double));