![](/img/trans.png)
[英]Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?
[英]Use std::begin(), std::end() to convert ArrayXd to stl vector,
在我看來,我應該能夠使用std::begin()
和std::end()
將ArrayXd
轉換為std::vector<double>
; 但是,當我在以下代碼中嘗試時,我的嘗試失敗了。 我的理解是,任何Eigen
對象上的.data()
方法都返回一個指向連續內存塊的指針,類似於c樣式數組。 因此,由於我可以在ac樣式數組上使用std::begin()
, std::end()
,因此我希望它也可以與.data()
一起使用。 但是,Eigen類是模板化的,我認為這是導致我出現問題的原因,但沒有找到解決此問題的方法。 應該怎么做?
#include <iostream>
#include <vector>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
ArrayXd e_array(5);
e_array << 3,4,5,6,7;
double c_array[] = {1,2,3,4,5};
//Fails
// std::vector<double> my_vec(std::begin(e_array.data()), std::end(e_array.data()));
// Works
// std::vector<double> my_vec(e_array.data(), e_array.data() + 5);
// Works
// std::vector<double> my_vec(std::begin(c_array), std::end(c_array));
// Works
// std::vector<double> my_vec(c_array, c_array + 5);
return 0;
}
我的錯誤消息(第一行,整個消息很長):
錯誤:沒有匹配的函數來調用'begin(Eigen :: PlainObjectBase> :: Scalar *)'std :: vector my_vec(std :: begin(e_array.data()),std :: end(e_array.data() ))
std::begin(vec.data())
無法工作,因為data()返回的原始指針無法傳達向量中元素的數量。 此版本是您最好的版本:
std::vector<double> my_vec(e_array.data(), e_array.data() + 5);
更好一點:
std::vector<double> my_vec(e_array.data(), e_array.data() + e_array.size());
而且,您可能還可以使用許多容器來執行此操作,但尤其不能使用Eigen的ArrayXd來執行此操作,因為它缺少begin()
和end()
(相關信息: http : //eigen.tuxfamily.org/bz/show_bug.cgi? id = 231 )。
std::vector<double> my_vec(foo.begin(), foo.end());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.