C++ C++;2D矢量-将int转换为double

C++ C++;2D矢量-将int转换为double,c++,vector,C++,Vector,将vector vint转换为vectorvdouble的好方法是什么 我知道这可以在一维情况下完成,但我不太确定如何在二维情况下完成。最简单的解决方案是使用两个循环,一个嵌套在另一个循环中 您还可以使用,例如,与,反过来也调用嵌套向量,这做实际的转换 如果您使用记住目标向量的名称,或使用例如..#include #包括 #包括 双卡斯托双音(整数v){ 返回静态_-cast(v); } int main(){ std::矢量intv; std::向量双V; std::transform(int

vector vint
转换为
vectorvdouble
的好方法是什么


我知道这可以在一维情况下完成,但我不太确定如何在二维情况下完成。

最简单的解决方案是使用两个循环,一个嵌套在另一个循环中

您还可以使用,例如,与,反过来也调用嵌套向量,这做实际的转换

如果您使用记住目标向量的名称,或使用例如..

#include
#包括
#包括
双卡斯托双音(整数v){
返回静态_-cast(v);
}
int main(){
std::矢量intv;
std::向量双V;
std::transform(intv.begin()、intv.end()、std::back_插入器(doublev),[](const std::vector&iv){
std::载体dv;
std::transform(iv.begin()、iv.end()、std::back_inserter(dv)和castToDouble);
返回dv;
});
返回0;
}

一种简单的方法是使用
std::transform
std::vector
的范围构造函数。如果您使用的是
back\u inserter
,您应该
保留一些容量以避免重复重新分配

实例:

#包括
#包括
#包括
#包括
int main()
{
向量vvi={{1,2,3},{4,5,6},{7,8,9};
std::向量vvd;
vvd.储备(vvi.size());
标准::转换(开始(vvi)、结束(vvi)、标准::返回插入器(vvd),
[](const std::vector和vi){
返回std::vector(开始(vi),结束(vi));
});
//输出目标容器以进行验证:
对于每个(开始(vvd),结束(vvd),[](常数标准::向量和向量){
std::copy(开始(vd)、结束(vd)、std::ostream_迭代器(std::cout,“”);

std::cout这里有一个非常简单的解决方案,它使用
emplace\u 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));
std::vector intvec;
//intvec以某种方式填充
std::向量双向量;
doublevec.reserve(intvec.size());
对于(auto&v:intvec)双向量部署(std::begin(v),std::end(v));

好的,你对另一个向量中包含的每个向量都这样做。你应该对所有目标向量调用
reserve
。使用
emplace\u back
很好的提示!好奇,为什么你更喜欢
std::begin(v)
而不是
v.begin()
?@MustafaOzturk因为
std::begin
与成员函数版本的类型超集一起工作,所以为了一致性,我在任何地方都使用它。@TartanLlama这是一个很好的理由,但它仍然会伤害我的眼睛。@TartanLlama在这种情况下为什么我们不能使用
auto&v.intvec
#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";});
}
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));