C ++ przekonwertuj wektor <int> na wektor <double>

95

Jaki jest dobry, czysty sposób konwertowania pliku std::vector<int> intVecna std::vector<double> doubleVec. Albo, bardziej ogólnie, przekonwertować dwa wektory typów zamiennych?

Alan Turing
źródło

Odpowiedzi:

169

Użyj std::vectorkonstruktora zakresu:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
James McNellis
źródło
Więc mógłbyś wtedy również użyć tej std::copy(...)funkcji? Czy możesz dodać to do odpowiedzi?
Alan Turing
3
@Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float));lubv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy
1
zły pomysł, ponieważ wersja konstruktora zmieni rozmiar wektora, używając kategorii iteratorów, aby zauważyć, że są to iteratory o swobodnym dostępie, a następnie zarezerwuje wystarczającą ilość miejsca. Zmiana rozmiaru przed kopiowaniem to marnotrawna inicjalizacja zerowa.
Michael Goldshteyn
1
@MichaelGoldshteyn Nie rozumiem - jeśli wcześniej nie określisz rozmiaru, rozmiar zostanie automatycznie zmieniony po przekroczeniu pojemności (co powoduje wielokrotne kopiowanie wszystkich elementów). Okay, to amortyzowany czas liniowy, ale założę się, że nadal jest dużo wolniejszy niż pojedyncza inicjalizacja zerowa. Czy coś mi brakuje w twojej kłótni?
Algoman
2
@Algoman zobacz std::distance()„Jeśli jest to iterator o swobodnym dostępie, funkcja używa operatora- do obliczenia tego. W przeciwnym razie funkcja wielokrotnie używa operatora zwiększania (operator ++)”. Więc w tym przypadku ilość elementów można znaleźć odejmując iteratory. To, czy biblioteka standardowa jest zaimplementowana do używania std :: distance dla początkowej rezerwacji (), to inna kwestia, ale godbolt.org/z/6mcUFh zawiera przynajmniej wywołanie std :: distance ().
user1556435