我有一个包装矢量的类:
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
仍然很好奇为什么我的原始代码失败了!
答案 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));