versiones guia español descargar actualizar c++ vector

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 tipo T , b denota valores de tipo X , u denota un identificador, r denota un valor no constante de tipo X y rv denota un valor no constante de tipo X

X u(a)

X u = a;

Requiere: T es CopyInsertable en X (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);