1

我猜这个问题是建立在C++ convert vector<int> to vector<double>

我正在尝试将 int 类型的二维向量(存储在对象中)转换为 double 类型的二维向量。根据我提供的 SO 链接,

std::vector<int> intvec;
std::vector<double> doubvec(intvec.begin(),intvec.end());

应该对原始向量进行类型转换(确实如此)。

那么为什么下面的代码不起作用呢?

std::vector<std::vector<double>> rotmat(Mesh.matrix.begin(),Mesh.matrix.end());

我可以很好地完成下面的行,所以我知道没有其他问题。我错过了什么?

std::vector<double> dubvec(Mesh.matrix[0].begin(), Mesh.matrix[0].end());

网格定义为:

class MeshOut
{
public:

MeshOut();



MeshOut(vector < vector < int >>, vector < vector < int >>, int, int, double, int, bool);

vector<vector<int>> matrix;
vector<vector<int>> lv_mat;
int shortNum;
int SourceNum;
double smallestMeshSize;
int factor;
bool Fine;
....

我叫 Meshout Mesh(x,y,z,i,j,k,l); 在代码中。

4

2 回答 2

1

虽然原始类型intdouble类型之间存在隐式转换规则,但 and 之间std::vector<int>没有std::vector<double>

事实上,从类层次结构的角度来看,这两种类型之间没有关系。

于 2014-02-12T00:53:40.413 回答
0

简短的回答:使用循环并继续使用它;-P

长答案:如果您不遗余力地这样做,您可以避免循环。

您正在使用的vector构造函数采用一对迭代器:当它迭代时,它基本上vector用连续element_type(*iterator)的 s 填充,因此element_type需要从单个取消引用的迭代器值构造。要构造 a vector<vector<double>>,迭代器需要产生vector<double>可以隐式构造 s 的值。根据cppreference vector docs,可能有用的构造函数是:

  • vector(const vector&)

  • vector(vector&&)

  • vector(std::initializer_list<T> init, const Allocator& = Allocator())

其中,前两个需要预先存在的vector<double>对象,但最后一个更有趣一些。由于您Mesh是用户定义的类型,并且您创建了一个迭代器类型,当取消引用时会生成std::initializer_list<double>从连续vector<int>in切片的对象.matrix,那么您可以支持vector<vector<double>>您尝试过的构造语法。然后std::initializer_list<T>s 是有效的临时变量,可能无法被优化掉,但如果您std::vector<double>在使用单个显式循环后复制,情况也是如此。如果您真的关心效率,请分析并与使用reserveand push_back...的嵌套循环进行比较。

于 2014-02-12T02:33:25.420 回答