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