C ++ convertir le vecteur <int> en vecteur <double>

93

Quelle est une bonne façon propre de convertir un fichier std::vector<int> intVecen std::vector<double> doubleVec. Ou, plus généralement, convertir deux vecteurs de types convertibles?

Alan Turing
la source

Réponses:

164

Utilisez std::vectorle constructeur de plage:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
James McNellis
la source
Alors, vous pouvez également utiliser la std::copy(...)fonction? Pourriez-vous ajouter cela à la réponse?
Alan Turing
3
@Lex:, copy(v_int.begin(), v_int.end(), back_inserter(v_float));ouv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy
1
mauvaise idée, car la version du constructeur va pré-dimensionner le vecteur en utilisant la catégorie d'itérateur pour noter que ce sont des itérateurs à accès aléatoire et en réservant ensuite suffisamment d'espace. Le redimensionnement avant la copie est une initialisation inutile.
Michael Goldshteyn
1
@MichaelGoldshteyn Je ne comprends pas - si vous ne spécifiez pas la taille à l'avance, elle sera redimensionnée automatiquement chaque fois que la capacité est dépassée (ce qui copie tous les éléments encore et encore). D'accord, c'est du temps linéaire amorti, mais je parie que c'est encore beaucoup plus lent qu'une seule initialisation à 0. Est-ce que je rate quelque chose dans votre argument?
Algoman
1
@Algoman voir std::distance()"S'il s'agit d'un itérateur à accès aléatoire, la fonction utilise l'opérateur- pour le calculer. Sinon, la fonction utilise l'opérateur d'augmentation (opérateur ++) à plusieurs reprises." Donc, dans ce cas, la quantité d'éléments peut être trouvée en soustrayant les itérateurs. Si la bibliothèque standard est implémentée pour utiliser std :: distance pour une réserve initiale () est une autre question, mais godbolt.org/z/6mcUFh contient au moins un appel à std :: distance ().
user1556435