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


93

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

Answers:


164

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

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

那么,您还可以使用该std::copy(...)功能吗?您可以将其添加到答案中吗?
艾伦·图灵

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());
Jon Purdy

1
这是个好主意,因为构造函数版本会使用迭代器类别来预定义向量的大小,请注意这些是随机访问迭代器,然后保留足够的空间。在复制之前调整大小是浪费的零初始化。
Michael Goldshteyn 2011年

1
@MichaelGoldshteyn我不明白-如果您事先没有指定大小,那么每当超出容量时,它将自动调整大小(一遍又一遍地复制所有元素)。好的,这是摊销的线性时间,但是我敢打赌,这仍然比单个0初始化慢很多。我是否想念您的论点?
Algoman

1
@Algoman请参阅std::distance()“如果它是随机访问迭代器,则该函数将使用operator-进行计算。否则,该函数将反复使用递增运算符(operator ++)。” 因此,在这种情况下,可以通过减去迭代器来找到元素数量。是否将标准库实现为将std :: distance用作初始reserve()是另一个问题,但是godbolt.org/z/6mcUFh至少包含对std :: distance()的调用。
user1556435 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.