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?

Réponses:


164

Utilisez std::vectorle constructeur de plage:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.