gpt4 book ai didi

c++ - 使用 memcpy 将 vector 的内容复制到内存缓冲区

转载 作者:可可西里 更新时间:2023-11-01 16:01:41 24 4
gpt4 key购买 nike

我有一个包装 vector 的类:

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

实例是:

PersistentVector<double> moments;

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

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

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

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

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

最佳答案

我尝试了 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));

关于c++ - 使用 memcpy 将 vector<double> 的内容复制到内存缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22602486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com