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

Ala*_*ing 87 c++ stl vector type-conversion

什么是一个转换的好干净的方式std::vector<int> intVecstd::vector<double> doubleVec.或者,更一般地说,转换两种可转换类型的向量?

Jam*_*lis 153

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

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
Run Code Online (Sandbox Code Playgroud)

  • @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());` (3认同)
  • 坏主意,因为构造函数版本将通过使用迭代器类别来预先确定向量的大小,以注意这些是随机访问迭代器,然后保留足够的空间。在复制之前调整大小是一种浪费的零初始化。 (2认同)
  • @MichaelGoldshteyn 我不明白-如果您没有事先指定大小,那么每当超出容量时都会自动调整大小(一遍又一遍地复制所有元素)。好的,这是摊销的线性时间,但我敢打赌这仍然比单个 0 初始化慢很多。我是否遗漏了你的论点? (2认同)
  • @Algoman 参见 `std::distance()` “如果它是一个随机访问迭代器,该函数使用 operator- 来计算它。否则,该函数重复使用递增运算符(operator++)。” 所以在这种情况下,可以通过减去迭代器来找到元素的数量。标准库是否被实现为将 std::distance 用于初始 Reserve() 是另一个问题,但 https://godbolt.org/z/6mcUFh 至少包含对 std::distance() 的调用。 (2认同)

Yas*_*Yas 11

使用std::transform算法:

std::transform(intVec.begin(), intVec.end(), doubleVec.begin(), [](int x) { return (double)x;});
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但我相信使用 static_cast&lt;double&gt;() 而不是 (double) 更安全,因为它会检查编译时是否可以进行转换 (3认同)