C ++ перетворює вектор <int> у вектор <double>


93

Який хороший чистий спосіб перетворити std::vector<int> intVecна std::vector<double> doubleVec. Або, загальніше, перетворити два вектори конвертованих типів?

Відповіді:


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());
Джон Перді

1
погана ідея, тому що версія конструктора буде визначати розмір вектора, використовуючи категорію ітераторів, щоб зазначити, що це ітератори довільного доступу, а потім резервує достатньо місця. Зміна розміру до копіювання - марнотратна нульова ініціалізація.
Майкл Голдштейн,

1
@MichaelGoldshteyn Я не розумію - якщо ви не вкажете розмір заздалегідь, тоді його розмір буде автоматично змінено при перевищенні ємності (що копіює всі елементи знову і знову). Гаразд, це амортизований лінійний час, але я впевнений, що це все-таки набагато повільніше, ніж одна 0-ініціалізація. Мені чогось не вистачає у вашому аргументі?
Альгоман,

1
@Algoman див. std::distance()"Якщо це ітератор з довільним доступом, функція використовує оператор - для обчислення цього. В іншому випадку функція використовує оператор збільшення (operator ++) неодноразово." Тож у цьому випадку кількість елементів можна знайти, віднявши ітератори. Інше питання, чи реалізована стандартна бібліотека для використання std :: distance для початкового резерву (), але godbolt.org/z/6mcUFh принаймні містить виклик std :: distance ().
user1556435
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.