c++ - guia - qgis manual
¿Se copia la capacidad en un vector? (4)
¿Se copia la capacidad?
En la práctica, no. Lo probé en línea en Clang y GCC , así como en MSVC y ninguno de ellos copió la capacidad.
¿Habrá una reasignación en la última línea?
Si la capacidad es menor que el argumento de reservar (es decir, no se copia), entonces sí.
¿La norma dice algo sobre esto o es silencioso?
No se proporcionan definiciones para el constructor de copia en vector.cons . En cambio, tenemos que mirar el container.requirements
X
denota una clase de contenedor que contiene objetos de tipoT
,b
denota valores de tipoX
,u
denota un identificador,r
denota un valor no constante de tipoX
yrv
denota un valor no constante de tipoX
X u(a)
X u = a;
Requiere:
T
esCopyInsertable
enX
(ver más abajo).publicación:
u == a
Ahora, ¿qué significa que dos contenedores sean iguales?
a == b
==
es una relación de equivalencia.equal(a.begin(), a.end(), b.begin(), b.end())
En otras palabras, dado que no requiere que la
capacity
sea igual en la comparación, entonces no hay razón para copiar la
capacity
.
Toma el siguiente código:
std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a); //NOTE: b is constructed from a
a.reserve(65536); // no reallocation
b.reserve(65536);
¿Se copia la capacidad? ¿Habrá una reasignación en la última línea? ¿La norma dice algo sobre esto o es silencioso?
Bueno, una simple comprobación como la siguiente revela que la capacidad no se copia:
std::vector<int> a;
a.reserve(65536);
cout << "a.capacity is " << a.capacity() << endl; // prints 65536
std::vector<int> b(a); //NOTE: b is constructed from a
cout << "b.capacity is " << b.capacity() << endl; // prints 0
Creo que al copiar el vector aa
b
, la capacidad de
b
se establece en el tamaño de
a
en la mayoría de los compiladores;
Aunque esto no está garantizado.
No, no se garantiza que la capacidad sea preservada por una construcción de copia
vector
.
Puede hacerlo de la siguiente manera:
vector<int> b;
b.reserve( a.capacity() );
b = a;
Mejor encapsulado en una función.
Standard no dice nada acerca de preservar la capacidad cuando llama al constructor de copias. Entonces no tienes ninguna garantía al respecto.
Pero puede hacer el siguiente truco, que intercambia el estado de a y b, si necesita preservar la capacidad solo en la copia:
std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a);
b.swap(a); // now b has a''s state
assert(b.capacity() == 65536);