【问题标题】:two dimensional vector typecasting二维向量类型转换
【发布时间】:2014-03-10 02:14:10
【问题描述】:

我猜这个问题是基于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);在代码中。

【问题讨论】:

  • 感谢 Ypnos 对第一个问题的回答,但这又引发了另一个问题:有没有办法在没有循环的情况下做到这一点?
  • 请准确发布“Mesh.matrix”声明的内容。
  • 要在没有显式循环的情况下执行此操作,您可以将 for_each() 与必需的函子一起使用。

标签: c++ vector casting 2d-vector


【解决方案1】:

虽然基本intdouble 类型之间存在隐式转换规则,但std::vector&lt;int&gt;std::vector&lt;double&gt; 之间没有。

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

【讨论】:

  • 啊,我明白了。那么有没有什么方法可以不用循环呢?
【解决方案2】:

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

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

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

  • vector(const vector&amp;)

  • vector(vector&amp;&amp;)

  • vector(std::initializer_list&lt;T&gt; init, const Allocator&amp; = Allocator())

其中,前两个需要预先存在的vector&lt;double&gt; 对象,但最后一个更有趣一些。由于您的 Mesh 是用户定义的类型,并且您创建了一个迭代器类型,当取消引用该迭代器类型时,将生成从 .matrix 中的连续 vector&lt;int&gt; 切片的 std::initializer_list&lt;double&gt; 对象,那么您可以支持您尝试的 vector&lt;vector&lt;double&gt;&gt; 构造语法。 std::initializer_list&lt;T&gt;s 然后实际上是可能无法被优化掉的临时变量,但是如果您在使用单个显式循环后复制 std::vector&lt;double&gt; 周围也是如此。如果您真的关心效率,请使用 reservepush_back....

与嵌套循环进行比较

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多