Notas de lectura "C ++ Primer"-Capítulo 02 Operaciones admitidas por contenedores

Autor: Ma Zhifeng
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

  1. Los contenedores son todas clases de plantillas
  2. Iterador
  3. funciones de inicio y finalización
  4. Definición e inicialización
  5. Cesión y permuta
  6. Tamaño de contenedor
  7. 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

  1. Copie todo el contenedor directamente (requiere que el tipo de contenedor y el tipo de elemento de los dos contenedores coincidan)
  2. 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

Supongo que te gusta

Origin blog.csdn.net/qq_26751117/article/details/53576870
Recomendado
Clasificación