Prefiero dos formas:
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);
}
¿Cómo lo haces?
Respuestas:
Su segundo ejemplo no funciona si envía el argumento por referencia. Querías decir
Eso funcionaría, pero una forma más fácil es
fuente
original
es una copia del argumento de la función.Sin embargo, no son lo mismo, ¿verdad? Uno es una copia, el otro es un intercambio . De ahí los nombres de las funciones.
Mi favorito es:
Donde
a
yb
son vectores.fuente
a = b
entonces no. Asignación significa:a
igualarb
sin cambiarb
. Por el contrario,std::swap(a, b)
sería intercambiar sus contenidos (por lo queb
'ssize
ahora sería loa
' s había sido antes). Quizás esté pensando en una operación de movimiento (como ocurre en C ++ 11, pero no en una tarea ordinaria como esta). Tal movimiento dejaríab
en un, ejem, estado "interesante" - ver stackoverflow.com/questions/17730689/…&&
. Esa versión solo se utilizará para una referencia de valor. No coincidirá con ningún valor no constante (comob
en mi ejemplo anterior). Puede convertirseb
en uno diciendoa = std::move(b);
Ver en.cppreference.com/w/cpp/language/value_category para niveles de complejidad aún mayores.Esta es otra forma válida de hacer una copia de un vector, solo use su constructor:
Esto es aún más simple que usar
std::copy
para recorrer todo el vector de principio a fin hastastd::back_insert
el nuevo vector.Dicho esto, el tuyo
.swap()
no es una copia, sino que intercambia los dos vectores. ¡Modificaría el original para no contener nada más! Que no es una copia.fuente
a = b;
porque ya tengo un campo de miembrosa
y solo necesito asignarlo con el nuevo valor deb
Respuesta directa:
=
operadorPodemos usar la función miembro público
std::vector::operator=
del contenedorstd::vector
para asignar valores de un vector a otro.Además, una función constructora también tiene sentido. Una función constructora con otro vector como parámetro (p
x
. Ej. ) Construye un contenedor con una copia de cada uno de los elementosx
, en el mismo orden.Precaución:
std::vector::swap
std::vector::swap
no está copiando un vector a otro, en realidad está intercambiando elementos de dos vectores, tal como sugiere su nombre. En otras palabras, el vector de origen para copiar se modifica después de questd::vector::swap
se llama, lo que probablemente no sea lo que se espera.Si los elementos en el vector fuente son punteros a otros datos, a veces se necesita una copia profunda.
De acuerdo con wikipedia:
En realidad, actualmente no hay una forma integrada en C ++ para hacer una copia profunda. Todas las formas mencionadas anteriormente son poco profundas. Si es necesaria una copia profunda, puede atravesar un vector y hacer una copia de las referencias manualmente. Alternativamente, se puede considerar un iterador para atravesar. La discusión sobre el iterador está más allá de esta pregunta.
Referencias
La página de
std::vector
en cplusplus.comfuente
no debe usar el intercambio para copiar vectores, cambiaría el vector "original".
pasar el original como parámetro al nuevo en su lugar.
fuente
fuente
En caso de que el vector YA existiera y quisieras copiarlo, puedes hacer esto:
fuente
newVec = oldVec
lo mismo que una de las otras respuestas.