Notas de estudio de C++ Introducción 23-STL y vector simple y práctico

22.1 Prefacio - El nacimiento de STL

  • Durante mucho tiempo, el mundo del software ha querido construir algo reutilizable.
  • El propósito de las ideas de programación genérica y orientada a objetos de C++ es mejorar la reutilización .
  • En la mayoría de los casos, las estructuras de datos y los algoritmos no cuentan con un conjunto de estándares, lo que genera una gran duplicación de trabajo.
  • Con el fin de establecer un conjunto de estándares para estructuras de datos y algoritmos, nació STL .

22.2 Conceptos básicos de STL

  • STL (biblioteca de plantillas estándar, biblioteca de plantillas estándar)
  • STL se divide ampliamente en: contenedor (contenedor), algoritmo (algoritmo), iterador (iterador)
  • El contenedor y el algoritmo están perfectamente conectados a través de iteradores (los iteradores son equivalentes a los puentes).
  • Casi todo el código en STL usa clases de plantilla o funciones de plantilla.

22.3 Seis componentes de STL

STL se divide aproximadamente en seis componentes principales, a saber: contenedor, algoritmo, iterador, funtor, adaptador (adaptador) y configurador de espacio.

  1. Contenedor: varias estructuras de datos, como vector, lista, deque, conjunto, mapa, etc., se utilizan para almacenar datos.
  2. Algoritmos: varios algoritmos de uso común, como ordenar, buscar, copiar, for_each, etc.
  3. Iterador: Actúa como el pegamento entre el contenedor y el algoritmo.
  4. Functor: se comporta como una función y puede usarse como una especie de estrategia para un algoritmo.
  5. Adaptador: Una cosa que se usa para decorar un contenedor o una interfaz de iterador o funtor.
  6. Configurador de espacios: Responsable de la configuración y gestión de espacios.

22.4 Contenedores, Algoritmos, Iteradores en STL

22.4.1 Contenedores

Contenedor: un lugar de almacenamiento.
El contenedor STL es para realizar algunas de las estructuras de datos más utilizadas .
Estructuras de datos de uso común: arreglos, listas enlazadas, árboles, pilas, colas, conjuntos, tablas de mapeo, etc.
Estos contenedores se pueden dividir en dos tipos: contenedores secuenciales y contenedores asociativos:

  • Contenedor secuencial: enfatiza la clasificación de valores, y cada elemento en el contenedor secuencial tiene una posición fija (todos los que he aprendido hasta ahora son secuenciales).
  • Contenedor asociativo: estructura de árbol binario, no existe una relación estricta de orden físico entre los elementos.

22.4.2 Algoritmos

Algoritmos: La solución al problema también se
limita a pasos para resolver problemas lógicos o matemáticos.Este tema se llama Algoritmos.Los
algoritmos se dividen en algoritmos de cambio cualitativo y algoritmos de cambio no cualitativo .

  • Algoritmo de cambio cualitativo: Significa que el contenido de los elementos en el intervalo cambiará durante la operación. como copiar, reemplazar, eliminar, etc.
  • Algoritmo no cualitativo: significa que el contenido de los elementos en el intervalo no cambiará durante la operación, como buscar, contar, atravesar, encontrar valores extremos, etc.

22.4.3 Iteradores

Iteradores: el vínculo entre contenedores y algoritmos
Proporcionan una manera de buscar secuencialmente a través de los elementos contenidos en un contenedor sin exponer la representación interna del contenedor. Los algoritmos utilizan iteradores para acceder a los elementos del contenedor.
Cada contenedor tiene su propio iterador dedicado.
El uso de iteradores es muy similar a los punteros.En la etapa inicial, primero podemos entender que los iteradores son punteros.

Tipos de iteradores:
inserte la descripción de la imagen aquílos tipos de iteradores de uso común en contenedores son los iteradores bidireccionales y los iteradores de acceso aleatorio.


22.5 Introducción a los iteradores de algoritmos de contenedor

22.5.0 Prefacio

Después de comprender los conceptos de contenedores, algoritmos e iteradores en STL. Usamos el código para sentir el encanto de STL.
El contenedor más utilizado en STL es Vector, que puede entenderse como una matriz. A continuación, aprenderemos cómo insertar datos en este contenedor y atravesar este contenedor.

22.5.1 Vector almacena tipos de datos incorporados

Contenedor: vector, necesita importar el archivo de encabezado <vector>
Algoritmo: for_each, necesita importar el archivo de encabezado del algoritmo estándar <algorithm>
Iterador:vector<int>::iterator

Ejemplo:

#include<iostream>
using namespace std;
#include<vector>  //STL中所有东西都要头文件
#include<algorithm>  //标准算法头文件
//vector容器存放内置数据类型

void myprint(int val)
{
    
    
	cout << val << endl;
}
void test01()
{
    
    	
	//创建了一个vector容器,数组
	vector<int> v;

	//向容器中插入数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	//通过迭代器来访问容器中的数据
	vector<int>::iterator itBegin = v.begin(); //起始迭代器  指向容器中第一个元素的位置
	vector<int>::iterator itEnd = v.end(); //结束迭代器 指向最后一个元素的下一个位置

	//第一种遍历方式,不常用
	while (itBegin != itEnd)
	{
    
    
		cout << *itBegin << endl;
		itBegin++;
	}

	//第二种遍历方式,常用
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << endl;
	}

	//利用STL中的遍历算法
	for_each(v.begin(), v.end(), myprint);
	//for_each作用就是依次将数据取出防止自己定义的函数中
}

int main()
{
    
    	
	test01();
	system("pause");
	return 0;
}

22.5.2 Vector almacena tipos de datos personalizados

Ejemplo:

#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<algorithm>
class Person2
{
    
    
public:
	Person2(string name, int age)
	{
    
    
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
};
//存放自定义数据类型
void test2_01()
{
    
    
	vector<Person2> v;
	Person2 p1("aaa", 10);
	Person2 p2("bbb", 20);
	Person2 p3("ccc", 30);
	Person2 p4("ddd", 40);
	Person2 p5("eee", 50);

	//添加
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);

	//遍历
	for (vector<Person2>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << "姓名: " << (*it).name << " 年龄: " << (*it).age << endl;
		//cout << "姓名: " << it->name << " 年龄: " << it->age << endl;
	}

}
//存放自定义数据类型的指针
void printPerson2(Person2* p)
{
    
    
	cout << "姓名: " << p->name << " 年龄: " << p->age << endl;
}
void test2_02()
{
    
    
	vector<Person2*> v;
	Person2 p1("aaa", 10);
	Person2 p2("bbb", 20);
	Person2 p3("ccc", 30);
	Person2 p4("ddd", 40);
	Person2 p5("eee", 50);

	//添加
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	v.push_back(&p5);

	//遍历
	cout << "-------------------" << endl;
	for_each(v.begin(), v.end(), printPerson2);
}

int main()
{
    
    
	test2_01();
	test2_02();
	system("pause");
	return 0;
}

22.5.3 Contenedor vectorial Contenedor anidado

Ejemplo:

#include<iostream>
using namespace std;
#include<vector>
void test3_01()
{
    
    
	vector<vector<int>> v;

	vector<int>v1;
	vector<int>v2;
	vector<int>v3;
	vector<int>v4;

	for (int i = 0; i < 5; i++)
	{
    
    
		v1.push_back(i);
		v2.push_back(i+1);
		v3.push_back(i+2);
		v4.push_back(i+3);
	}

	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);

	for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		for (vector<int>::iterator jit = it->begin(); jit != it->end(); jit++)
		{
    
    
			cout << *jit << " ";
		}
		cout << endl;
	}
}

int main()
{
    
    
	test3_01();
	system("pause");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_49030008/article/details/123648299
Recomendado
Clasificación