Wolę dwa sposoby:
void copyVecFast(const vec<int>& original)
{
vector<int> newVec;
newVec.reserve(original.size());
copy(original.begin(),original.end(),back_inserter(newVec));
}
void copyVecFast(vec<int>& original)
{
vector<int> newVec;
newVec.swap(original);
}
Jak ty to robisz?
Odpowiedzi:
Twój drugi przykład nie zadziała, jeśli wyślesz argument przez odwołanie. Miałeś na myśli
To by zadziałało, ale jest łatwiejszy sposób
źródło
original
jest kopią argumentu funkcji.Ale to nie to samo, prawda? Jedna to kopia, druga to zamiana . Stąd nazwy funkcji.
Mój ulubiony to:
Gdzie
a
ib
są wektory.źródło
a = b
nie. Przypisanie oznacza:a
wyrównaćb
bez zmianyb
. W przeciwieństwie do tego,std::swap(a, b)
by wymieniać ich zawartości (takb
'ssize
będzie teraz coa
jest przedtem). Być może myślisz o operacji przenoszenia (jak ma to miejsce w C ++ 11, ale nie w zwykłym zadaniu, takim jak to). Taki ruch pozostawiłbyb
w, hm, „interesującym” stanie - patrz stackoverflow.com/questions/17730689/…&&
. Ta wersja będzie używana tylko jako odniesienie do wartości r. Nie będzie pasować do żadnej wartości innej niż stała (tak jakb
w moim przykładzie powyżej). Możesz zamienić sięb
w jeden, mówiąc:a = std::move(b);
Zobacz en.cppreference.com/w/cpp/language/value_category, aby uzyskać jeszcze wyższy poziom złożoności.To kolejny ważny sposób na wykonanie kopii wektora, po prostu użyj jego konstruktora:
Jest to nawet prostsze niż użycie
std::copy
przejścia całego wektora od początku do końca dostd::back_insert
nowego wektora.To powiedziawszy, twój
.swap()
jeden nie jest kopią, zamiast tego zamienia dwa wektory. Zmodyfikowałbyś oryginał, aby już nic nie zawierał! Który nie jest kopią.źródło
Bezpośrednia odpowiedź:
=
operatoraMożemy użyć publicznej funkcji członkowskiej
std::vector::operator=
kontenerastd::vector
do przypisania wartości z jednego wektora do innego.Poza tym funkcja konstruktora również ma sens. Funkcja konstruktora z innym wektorem jako parametrem (np.
x
) Konstruuje kontener z kopią każdego elementu wx
, w tej samej kolejności.Uwaga:
std::vector::swap
std::vector::swap
to nie kopiowanie wektora do innego, w rzeczywistości zamiana elementów dwóch wektorów, tak jak sugeruje jego nazwa. Innymi słowy, wektor źródłowy do skopiowania jest modyfikowany postd::vector::swap
wywołaniu, co prawdopodobnie nie jest tym, czego się oczekuje.Jeśli elementy w wektorze źródłowym są wskaźnikami do innych danych, czasami potrzebna jest głęboka kopia.
Według Wikipedii:
W rzeczywistości nie ma obecnie wbudowanego sposobu w C ++, aby wykonać głęboką kopię. Wszystkie wymienione powyżej sposoby są płytkie. Jeśli konieczna jest głęboka kopia, możesz przejść przez wektor i ręcznie skopiować odniesienia. Alternatywnie do przechodzenia można rozważyć iterator. Dyskusja na temat iteratora wykracza poza to pytanie.
Bibliografia
Strona w
std::vector
witrynie cplusplus.comźródło
nie powinieneś używać zamiany do kopiowania wektorów, zmieniłoby to "oryginalny" wektor.
zamiast tego przekazać oryginał jako parametr do nowego.
źródło
źródło
W przypadku, gdy wektor JUŻ istniał i chciałeś po prostu skopiować, możesz zrobić to:
źródło
newVec = oldVec
to samo, co jedna z innych odpowiedzi.