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?

Odpowiedzi:


169

Użyj std::vectorkonstruktora zakresu:

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.