C++ 2D向量 - 将整数转换为双精度

4

如何将vector<vector<int>> vint转换为vector<vector<double>>vdouble的好方法是什么?

C++ convert vector<int> to vector<double>我知道这可以在一维情况下完成,但我不太确定如何处理二维情况。


2
好的,您需要为包含在另一个向量中的每个向量执行此操作。 - πάντα ῥεῖ
4个回答

6
这里有一个非常简单的解决方案,它使用了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));

使用emplace_back的好提示! - Victor Polevoy
你好奇为什么你更喜欢使用 std::begin(v) 而不是 v.begin() - Mustafa Ozturk
1
@MustafaOzturk 因为 std::begin 可以处理更多类型的数据,所以我在任何地方都使用它以保持一致性。 - TartanLlama
@TartanLlama 这是一个相当好的理由,但这仍让我的眼睛疼。 - Mustafa Ozturk
@TartanLlama 为什么我们不能在这种情况下使用 auto& v . intvec - Gilfoyle

3
#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;
}

好的解决方案,这也适用于其他数值类型的2D到2D向量转换问题,在cast函数中稍作调整即可。 - Amir Rasti

0

一个简单的方法是使用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";});
}

1
你应该在所有目标向量上调用 reserve - Mustafa Ozturk

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接