将 C++ 中的 vector<int> 转换为 vector<double>

121

如何以简洁明了的方式将 std::vector<int> intVec 转换为 std::vector<double> doubleVec,或者更一般地说,如何将两个可转换类型的向量进行转换?

2个回答

205

使用 std::vector 的范围构造函数:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

1
那么,你也可以使用 std::copy(...) 函数吗?你能把它加到答案中吗? - Alan Turing
3
@Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float)); 或者 v_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());这段代码的意思是将一个整型向量v_int中存储的数据拷贝到一个浮点型向量v_float中。第一种方法使用了back_inserter函数将元素插入到v_float的末尾,第二种方法通过调整v_float的大小并使用begin()函数将元素插入到v_float的开始处来实现。 - Jon Purdy
1
不好的想法,因为构造函数版本将使用迭代器类别预调整向量大小,以便标注这些是随机访问迭代器,然后保留足够的空间。在复制之前调整大小会浪费零初始化的资源。 - Michael Goldshteyn
2
@MichaelGoldshteyn 我不明白 - 如果你事先不指定大小,那么每当超过容量时它都会自动调整大小(这会一遍又一遍地复制所有元素)。好吧,这是摊销线性时间,但我敢打赌,这仍然比单个0初始化慢得多。你的论点有什么我没注意到的地方吗? - Algoman
2
@Algoman 参见 std::distance() "如果它是一个随机访问迭代器,函数使用 operator- 来计算。否则,函数使用递增运算符 (operator++) 重复执行。" 因此,在这种情况下,元素的数量可以通过减去迭代器来找到。标准库是否实现了使用 std::distance() 进行初始 reserve() 是另一个问题,但是 https://godbolt.org/z/6mcUFh 至少包含对 std::distance() 的调用。 - user1556435
显示剩余2条评论

9
使用 std::transform 算法:
std::transform(intVec.begin(), intVec.end(), doubleVec.begin(), [](int x) { return (double)x;});

3
好的解决方案,但我认为使用 static_cast<double>() 要比 (double) 更安全,因为它会在编译时检查是否可以进行强制转换。 - Or Hirshfeld

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