Enlace: https: //zhuanlan.zhihu.com/p/24297619
Fuente: saber casi con
derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.
declaración:
- El contenido del artículo se recopila y compila de "C ++ Primer Chinese Edition (5th Edition)", y los derechos de autor pertenecen al libro original.
- El libro original tiene interpretaciones más detalladas y maravillosas, compre libros genuinos para aprender.
- Este artículo es solo para aprendizaje y comunicación, cualquier forma de reimpresión está prohibida.
texto
- Los contenedores son todas clases de plantillas
- Iterador
- funciones de inicio y finalización
- Definición e inicialización
- Cesión y permuta
- Tamaño de contenedor
- Operaciones relacionales
Clase de plantilla
list<int>
deque<double>
También puede definir el contenedor del contenedor,
vector<string>
vector<vector<string>>
Iterador
Rango de iterador (inicio, fin)
puntos finales al elemento después del final, comenzar puede llegar al final incrementando
Este acuerdo de alcance nos permite atravesar el contenedor de forma sencilla y segura
while( begin != end )
{
cout << *begin << endl;
++begin;
}
Incluso no se necesitan operaciones nulas adicionales. Si begin == end, el rango está vacío y el bucle no se ejecutará
funciones de inicio y finalización
- begin devuelve el iterador inicial
- cbegin devuelve el iterador constante
- rbegin devuelve el iterador inverso
En realidad, hay dos funciones denominadas begin en el contenedor
- Uno es un miembro const, devolviendo el const_iterator del contenedor
- Uno es un miembro no constante y devuelve el iterador del contenedor
iterator begin();
const_iterator begin() const;
Por lo tanto, el siguiente juicio de tipo
auto itr = a.begin();
Solo cuando a es constante, itr es const_iterator
Definición e inicialización
Hay dos formas de crear un contenedor como copia de otro contenedor
- Copie todo el contenedor directamente (requiere que el tipo de contenedor y el tipo de elemento de los dos contenedores coincidan)
- Copie los elementos en el rango especificado por el iterador (solo los elementos se pueden convertir)
C c1(c2);
C c1 = c2;
C c( beg, end );
Inicialización de lista
list<string> authors = {"a", "b", "c"};
vector<const char*> articles = {"a", "b", "c"};
Constructor específico del contenedor de secuencia
Aceptar un tamaño de contenedor y un valor inicial (opcional)
vector<int> ivec(10, -1);
list<string> svec(10, "hi");
forward_list<int> ivec (10);
array no admite este método
construcción de matriz
Al igual que la matriz incorporada, el tamaño del contenedor es parte del tipo de matriz
array<int, 42> arr;
array<int, 42>::size_type i;
array<int, 10> ia1;
array<int, 10> ia2 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> ia3 = {42};
A diferencia de la matriz incorporada, la matriz admite copia y asignación
Cesión y permuta
c1 = c2;
Después de la asignación, el número y el valor de los elementos en c1 son los mismos que los de c2
Una vez completada la tarea, ¿existe una correlación entre los dos contenedores?
Para la matriz, la longitud es parte del tipo y el tipo debe ser coherente antes de la asignación.
array<int, 10> a1 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> a2 = {0};
a1 = a2;
y
array<int, 10> a2 = {0};
a2 = {0};
Es ilegal. matriz no acepta asignación de lista
También muestra que la inicialización y la asignación son dos cosas diferentes.
- La inicialización llama al constructor
- Función sobrecargada del operador llamada por asignación
asignar
El contenedor de secuencia también define un miembro llamado asignar
- seq.assign (beg, end) asigna los elementos en el rango del iterador al contenedor
- seq.assign (il) asigna los elementos de la lista de inicialización al contenedor
- seq.assign (n, t) reemplaza los elementos en el contenedor con n elementos cuyo valor es t
matriz tampoco admite asignar
intercambiar
Si dos contenedores son del mismo tipo, puede intercambiar su contenido con swap
Y el intercambio es mucho más rápido que las operaciones de copia de elementos, como asignación y asignación, porque solo cambia la estructura de datos del contenedor.
----------itr1-----------
-----------↓-------------
svec1→{A0, A1, A2,A3}
svec2→{B0, B1, B2, B3, B4}
Después del intercambio
----------itr1-----------
-----------↓-------------
svec2→{A0, A1, A2,A3}
svec1→{B0, B1, B2, B3, B4}
El intercambio es solo que la estructura del contenedor ha cambiado y los elementos señalados por iteradores anteriores, etc., no cambian. Pero el elemento pertenece a otro contenedor
La cadena es una excepción, llamar a swap hará que los iteradores, referencias y punteros dejen de ser válidos
La matriz es más especial, su intercambio es el intercambio de elementos reales
----------itr1-----------
-----------↓-------------
arr1→{A0, A1, A2,A3}
arr2→{B0, B1, B2, B3, B4}
Después del intercambio
arr1→{B0, B1, B2, B3, B4}
arr2→{A0, A1, A2,A3}
-----------↑-------------
----------itr1-----------
Operación de tamaño de contenedor
tamaño
vacío
max_size
Operaciones relacionales de contenedores
Solo se pueden comparar contenedores del mismo tipo