Biblioteca de plantillas estándar y algoritmo STL
Genérico: Es
la idea central de la biblioteca de plantillas estándar. El llamado genérico significa que el objeto está separado del tipo de datos al que pertenece el objeto.
STL es una biblioteca genérica:
todos sus componentes están compuestos por plantillas y sus elementos pueden ser de cualquier tipo.
La biblioteca estándar de C ++ consta de 6 componentes principales:
(1) Algoritmo genérico;
(2) Contenedor genérico;
(3) Iterador genérico;
(4) Objeto de función;
(5) Adaptador;
(6) Asignador;
1. Contenedor: gestiona una colección de objetos de cierto tipo;
2. Iterador: recorre la colección de objetos;
3. Algoritmo: proporciona algoritmos para procesar elementos en la colección; estándar C ++, STL está organizado en 13 archivos de encabezado,
Uno, algoritmo STL
STL utiliza plantillas de funciones para definir más de 70 algoritmos de uso común. Los algoritmos se incluyen principalmente en, de
uso común:
1. código de clasificación
:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[]={
2,5,8,6,8,5,55,88,8};
int len=(sizeof(a)/sizeof(*a));
sort(a,a+len);
for(int i=0;i<len;i++){
cout<<a[i]<<' ';
}
return 0;
}
Extensión (la clasificación es muy útil, la clasificación (a, a + n) es la clasificación predeterminada de pequeña a grande, también puede clasificar de grande a pequeña según sus necesidades, e incluso puede clasificar la estructura);
código:
//使用sort实现结构体排序
#include<iostream>
#include<algorithm>
using namespace std;
struct Point{
int x;
int y;
}p[4];
bool cmp(Point p1,Point p2){
if(p1.x==p2.x){
return p1.y<p2.y;
}else{
return p1.x<p2.x;
}
}
int main(){
for(int i=0;i<4;i++){
cin>>p[i].x;
cin>>p[i].y;
}
sort(p,p+4,cmp);
for(int i=0;i<4;i++){
cout<<"("<<p[i].x<<","<<p[i].y<<")"<<endl;
}
return 0;
}
En segundo lugar, cuente (devuelve el número de veces que aparece la tecla desde el punto de inicio hasta el punto final)
código:
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string str("one world one dream");
char key='e';
n=count(str.begin(),str.end(),key);
cout<<"key count:"<<n<<endl;
return 0;
}
Tres, otros algoritmos
En segundo lugar, el contenedor
Los contenedores STL se utilizan para almacenar y contener varios tipos de datos y se implementan como plantillas de clases.
Los contenedores STL se dividen en tres categorías:
1) contenedores secuenciales;
2) contenedores asociativos;
3) adaptadores de contenedor;
1. contenedores secuenciales;
uno, vector (vector): elementos almacenados continuamente;
dos, lista (lista): por nodos Los dos de manera que se compone la lista enlazada, cada nodo contiene uno;
tres, deque: una matriz de punteros a diferentes elementos almacenados continuamente;
2.contenedor asociativo:
uno, conjunto: no puede tener los mismos elementos;
Dos, conjunto múltiple (meltiset): puede tener los mismos elementos;
tres, mapa (mapa): un conjunto compuesto por {clave, valor};
3. Adaptador de contenedor:
uno, pila (pila): primero en entrar, último en salir
, dos, cola (cola): primero en entrar, primero en salir
3. Cola de prioridad (priority_queue): la prioridad más alta está al frente;
Nota:
Ejemplos de uso de vectores:
código:
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector <int> vi;
int a;
while(true){
cout<<"输入一个整数,按0停止"<<endl;
cin>>a;
if(a==0)break;
vi.push_back(a);
}
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
Cree un vector para
acceder a los elementos en la
inserción de vector o elimine el orden inverso y la copia de la función de
vector:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6),v2;//v1的初始化
v2.resize(6);//发配大小
copy(v1.begin(),v1.end(),v2.begin());//复制函数
reverse(v2.begin(),v2.end());//逆序函数
for(int i=0;i<v2.size();i++){
cout<<v2[i]<<" ";
}
return 0;
}
Tres, iterador
El iterador es un puntero encapsulado de alto nivel. Los usuarios pueden atravesar el contenedor o la secuencia sin preocuparse por el tipo de datos del objeto; el
iterador está en el archivo de encabezado : ,, el
proceso de recorrido del iterador :
begin () y end () : el
el iterador atraviesa la instancia:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6);
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){
cout<<*it<<' ';
}
return 0;
}
Ejercicio avanzado : ( Fusión ordenada de dos listas enlazadas)
input_case:
3 3
-1 22 8
9 -88 2
output_case:
-88 -1 2 8 9 22
código:
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> l1,l2;
int len_1,len_2;//两个链表的长度
scanf("%d %d",&len_1,&len_2);
int num;
for(int i=0;i<len_1;i++){
cin>>num;
l1.push_back(num);//加入链表
}
for(int i=0;i<len_2;i++){
cin>>num;
l2.push_back(num);//加入链表
}
l1.sort();//表1排序
l2.sort();//表2排序
l1.merge(l2);//l2归并到l1中
for(list<int>::iterator it=l1.begin();it!=l1.end();it++){
//迭代器遍历
cout<<*it<<' ';
}
return 0;
}
Tipo de iterador:
si diferentes contenedores admiten iteradores:
Nota : los iteradores también se pueden asignar mediante subíndices (solo se aplica a aquellos que admiten acceso aleatorio), como vector, pero no lista