C ++ конвертирует vector <int> в vector <double>


97

Какой хороший чистый способ преобразовать файл std::vector<int> intVecв std::vector<double> doubleVec. Или, в более общем смысле, преобразовать два вектора конвертируемых типов?

Ответы:


171

Используйте 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
плохая идея, потому что версия конструктора будет предварительно определять вектор, используя категорию итератора, чтобы отметить, что это итераторы с произвольным доступом, а затем зарезервировать достаточно места. Изменение размера перед копированием - это расточительная нулевая инициализация.
Михаил Гольдштейн

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

2
@Algoman см. std::distance()"Если это итератор с произвольным доступом, функция использует оператор- для вычисления. В противном случае функция повторно использует оператор увеличения (оператор ++)." Таким образом, в этом случае количество элементов может быть найдено путем вычитания итераторов. Реализована ли стандартная библиотека для использования std :: distance для начального резерва () - это другой вопрос, но godbolt.org/z/6mcUFh по крайней мере содержит вызов std :: distance ().
user1556435 03
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.