c++ 2D将int转换为double

C++ 2D Convert int to double

本文关键字:double 转换 int 2D c++      更新时间:2023-10-16

如何将vector<vector<int>> vint转换为vector<vector<double>>vdouble ?

我从c++中知道convert vectorvector这可以在一维情况下完成,但我不太确定如何在二维情况下完成

这是一个非常简单的解决方案,使用emplace_back和向量范围构造函数:

std::vector<std::vector<int>> intvec;
//intvec filled somehow
std::vector<std::vector<double>> doublevec;
doublevec.reserve(intvec.size());
for (auto&& v : intvec) doublevec.emplace_back(std::begin(v), std::end(v));
#include <iostream>                                                                                                                                                                                                                         
#include <vector>
#include <algorithm>
double castToDouble(int v) {
    return static_cast<double>(v);
}
int main() {
    std::vector<std::vector<int>> intv;
    std::vector<std::vector<double>> doublev;
    std::transform(intv.begin(), intv.end(), std::back_inserter(doublev), [](const std::vector<int> &iv) {
        std::vector<double> dv;
        std::transform(iv.begin(), iv.end(), std::back_inserter(dv), &castToDouble);
        return dv;
    });
    return 0;
}

简单的解决方案是使用两个循环,一个嵌套在另一个内部,最好是基于范围的for循环。

您也可以使用例如std::transform和lambda表达式,该表达式反过来也调用嵌套向量上的std::transform,后者进行实际的转换。

如果你使用std::transform,记得设置目标向量的大小,或者使用std::back_inserter

一个简单的方法是使用std::transformstd::vector的范围构造函数。如果您使用back_inserter,您应该reserve()一些容量,以避免重复的重新分配。

实例:http://coliru.stacked-crooked.com/a/84ef0e3d6572792a

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
    std::vector<std::vector<int>> vvi = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    std::vector<std::vector<double>> vvd;
    vvd.reserve(vvi.size());
    std::transform(begin(vvi), end(vvi), std::back_inserter(vvd),
                   [](const std::vector<int>& vi) {
                       return std::vector<double>(begin(vi), end(vi));
                   });
    // Output the destination container for verification:
    for_each(begin(vvd), end(vvd), [](const std::vector<double>& vd){
        std::copy(begin(vd), end(vd), std::ostream_iterator<double>(std::cout, " "));
        std::cout << "n";});
}