在 Eigen::Matrix::data() 上使用 std::move 将 Eigen::Matrix 转换为向量
Convert Eigen::Matrix to vector using std::move on Eigen::Matrix::data()
我知道这些转换主题已被多次提出,但我找不到考虑到移动语义的主题。
我想知道以下是否安全:
Eigen::MatrixXd A(n,n);
//fill matrix A
std::vector<double> A_vec;
A_vec.insert(A_vec.end(), std::make_move_iterator(A.data()), std::make_move_iterator(A.data() + A.size()));
//destruct A
假设,您实际上想对具有移动语义的非平凡标量(而不是 double
)执行此操作,这应该是安全的——当然,只要您不这样做之后使用 A
。对于 double
它也是安全的,但没有区别。
在您的情况下,将 std::vector
的数据映射到 Eigen::Map
实际上可能更好,如下所示:
std::vector<double> A_vec(n*n); // allocate data into A_vec
Eigen::Map<Eigen::MatrixXd> A(A_vec.data(), n, n);
// fill matrix A.
// data is immediately stored into A_vec
我知道这些转换主题已被多次提出,但我找不到考虑到移动语义的主题。
我想知道以下是否安全:
Eigen::MatrixXd A(n,n);
//fill matrix A
std::vector<double> A_vec;
A_vec.insert(A_vec.end(), std::make_move_iterator(A.data()), std::make_move_iterator(A.data() + A.size()));
//destruct A
假设,您实际上想对具有移动语义的非平凡标量(而不是 double
)执行此操作,这应该是安全的——当然,只要您不这样做之后使用 A
。对于 double
它也是安全的,但没有区别。
在您的情况下,将 std::vector
的数据映射到 Eigen::Map
实际上可能更好,如下所示:
std::vector<double> A_vec(n*n); // allocate data into A_vec
Eigen::Map<Eigen::MatrixXd> A(A_vec.data(), n, n);
// fill matrix A.
// data is immediately stored into A_vec