首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++:将指针向量复制到数组,到特征::ArrayXd

C++:将指针向量复制到数组,到特征::ArrayXd
EN

Stack Overflow用户
提问于 2022-11-17 11:37:51
回答 1查看 34关注 0票数 0

我有std::vector<double *> x,其中每个元素指向C样式的双数组。双数组的值随我的程序的每一次迭代而变化。我希望将它们的副本创建到Eigen::ArrayXd x_old中,这样我就可以用新的值计算差异。我尝试过使用Eigen::Map,但是它只复制了一个数组,而且它们仍然是从内存上连接的,所以在技术上它不是一个副本。现在我尝试memcpy它,但我只得到第一个数组。谢谢你的帮助

代码语言:javascript
复制
std::vector<double *> x;
x.push_back( new double[2]{1, 2} );
x.push_back( new double[2]{3, 4} );

Eigen::ArrayXd x_old(4);
memcpy(x_old.data(), *x.data(), 4*sizeof(double));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 12:39:04

memcpy(x_old.data(), *x.data(), 4*sizeof(double));的问题是,由于您手动为vector的每个元素分配内存,所以下面的数据不再是连续的,即2后面没有3。(指针的位置是连续的,但是它们指向的数组不是)

因此,当您将它们放入x_old中时,不能将它们作为连续的内存。相反,您需要分别添加vector的每个元素:

代码语言:javascript
复制
memcpy(x_old.data(), x[0], 2 * sizeof(double));
memcpy(x_old.data() + 2, x[1], 2 * sizeof(double));

或者编写一个for-循环:

代码语言:javascript
复制
for(std::size_t s = 0; const auto& data: x)
{
    memcpy(x_old.data() + s, data, 2 * sizeof(double));
    s += 2;
}

*x.data()x[0]是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74474821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档