Eu prefiro duas maneiras:
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);
}
Como você faz isso?
Respostas:
Seu segundo exemplo não funcionará se você enviar o argumento por referência. Você quis dizer
Isso funcionaria, mas uma maneira mais fácil é
fonte
original
é uma cópia do argumento da funçãoEles não são os mesmos, são? Um é uma cópia, o outro é uma troca . Daí os nomes das funções.
Meu favorito é:
Onde
a
eb
são vetores.fonte
a = b
então não. Atribuição significa: fazera
igualb
sem mudarb
. Por outro lado,std::swap(a, b)
seria trocar seu conteúdo (por issob
'ssize
agora seria tudo o quea
' s tinha sido antes). Talvez você esteja pensando em uma operação de movimentação (como ocorre no C ++ 11, mas não em uma tarefa comum como essa). Tal movimento deixariab
em um, ahem, estado "interessante" - veja stackoverflow.com/questions/17730689/…&&
. Essa versão será usada apenas para uma referência rvalue. Não corresponderá a nenhum valor que não seja const (comob
no meu exemplo acima). Você pode se transformarb
em um dizendoa = std::move(b);
See en.cppreference.com/w/cpp/language/value_category para níveis de complexidade ainda maiores.Esta é outra maneira válida de fazer uma cópia de um vetor, basta usar seu construtor:
Isso é ainda mais simples do que usar
std::copy
para mover o vetor inteiro do início ao fim atéstd::back_insert
o novo vetor.Dito isto, o seu
.swap()
não é uma cópia, mas troca os dois vetores. Você modificaria o original para não conter mais nada! O que não é uma cópia.fonte
a = b;
porque eu já tenho um campo de membroa
e só preciso atribuí-lo com o novo valor deb
Resposta direta:
=
operadorPodemos usar a função
std::vector::operator=
de membro pública do contêinerstd::vector
para atribuir valores de um vetor para outro.Além disso, uma função construtora também faz sentido. Uma função construtora com outro vetor como parâmetro (por exemplo
x
) constrói um contêiner com uma cópia de cada um dos elementosx
, na mesma ordem.Cuidado:
std::vector::swap
std::vector::swap
não está copiando um vetor para outro, na verdade está trocando elementos de dois vetores, exatamente como o nome sugere. Em outras palavras, o vetor de origem para copiar é modificado apósstd::vector::swap
ser chamado, o que provavelmente não é o que você espera.Se os elementos no vetor de origem são ponteiros para outros dados, algumas vezes é necessária uma cópia em profundidade.
De acordo com a wikipedia:
Atualmente, não há atualmente uma maneira interna em C ++ para fazer uma cópia profunda. Todas as formas mencionadas acima são superficiais. Se uma cópia profunda for necessária, você pode percorrer um vetor e fazer cópia das referências manualmente. Como alternativa, um iterador pode ser considerado para atravessar. A discussão sobre o iterador está além desta questão.
Referências
A página de
std::vector
em cplusplus.comfonte
você não deve usar swap para copiar vetores, isso mudaria o vetor "original".
passe o original como parâmetro para o novo.
fonte
fonte
Caso o vetor JÁ existisse e você quisesse apenas copiar, você poderia fazer o seguinte:
fonte
newVec = oldVec
o mesmo que uma das outras respostas.