Biblioteca de plantillas estándar (STL) de C++: vector, conjunto, cadena, mapa


uno, vectorial

Vector es una "matriz cuya longitud cambia automáticamente según sea necesario". En el algoritmo, a veces el uso de arreglos ordinarios excederá la memoria, en este caso se pueden usar arreglos vectoriales. Además, la matriz de vectores también se puede usar para almacenar gráficos en forma de lista de adyacencia, lo cual es muy amigable para aquellos que no pueden usar la matriz de adyacencia y tienen miedo de usar punteros para implementar la lista de adyacencia.

Para usar el vector, debe agregar el archivo de encabezado #include<vector>. Además, agregue la oración "usando el espacio de nombres estándar".

1. La definición de vector:

vector<typename> name;

typename es el tipo de datos básico:

vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;//node是结构体类型

vector también puede ser un contenedor estándar STL, pero en este caso, se debe agregar un espacio entre >> al definir, porque algunos compiladores lo considerarán como una operación de cambio, lo que resultará en un error de compilación. como sigue:

vector<vector<int> > name;

El método anterior se puede asociar con una matriz bidimensional, y esta matriz vectorial bidimensional se puede entender como una matriz bidimensional cuyas dos dimensiones pueden tener longitudes laterales.

Defina la matriz vectorial:

vector<typename> ArrayName[arraySize]; 

La definición anterior fija la longitud unidimensional a arraySize

2. Acceso a elementos en el contenedor de vectores:

Acceso por subíndice: igual que una matriz normal, subíndice de 0~vi.size()-1

Acceso a través de iteradores: los iteradores pueden entenderse como algo similar a los punteros

vector<typename>::iterator it;

De esta forma, se obtiene el iterador, y se puede acceder a los elementos que contiene a través de *it

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 0 ; i < 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vector<int>::iterator it = vi.begin();//it指向vi的首地址
    for(int i = 0 ; i < 5 ; i++)
        printf("%d ",*(it+i));
    return 0;
}

Hay otra forma de acceder:

    //迭代器能够实现自增操作
    for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
        printf("%d ",*it);

3. función push_back():
push_back(x) se refiere a agregar un elemento x detrás del vector, y la complejidad del tiempo es O(1)

4. La función pop_back()
elimina el elemento al final del vector y la complejidad del tiempo es O(1)

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 0 ; i < 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.pop_back();
    //迭代器能够实现自增操作
    for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
        printf("%d ",*it);
    return 0;
}

inserte la descripción de la imagen aquí

5. size()
obtiene el número de elementos en el vector, y la complejidad del tiempo es O(1)

6. clear()
se usa para borrar todos los elementos en el vector

7. insert()
insert(it,x): se usa para insertar un elemento x en cualquier iterador del vector, y la complejidad de tiempo es O(N)

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.insert(vi.begin()+2,-1);//将-1插入到vi[2]的位置
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

inserte la descripción de la imagen aquí

8. erase()
elimina un solo elemento erase(it): elimina el elemento donde se encuentra el iterador

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.erase(vi.begin()+2);//将-删除vi[2]
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

inserte la descripción de la imagen aquí
borrar (primero, último): Eliminar elementos en el rango [primero, último]

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.erase(vi.begin()+2,vi.begin()+4);//将-删除vi[2]、vi[3]
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

inserte la descripción de la imagen aquí
Usos comunes:

  • Puede ahorrar espacio cuando los elementos son inciertos
  • Dado que la cantidad de elementos de salida es incierta en algunas ocasiones, para procesar más convenientemente el último elemento que cumple con las condiciones sin generar espacios adicionales, primero puede usar el vector para registrar todos los elementos que deben generarse y luego generarlos todos. En seguida.
  • Almacenamiento de gráficos con listas de adyacencia

dos, conjunto

set es una colección que se ordena y corta automáticamente sin elementos repetidos. Cuando lo use, debe agregar #include<set> y usar el espacio de nombres estándar;

1. La definición de conjunto:

set<typename> name;

El método de definición específico es el mismo que el vector

2. Acceso a elementos en el conjunto:
solo se puede acceder al conjunto a través de iteradores, y los contenedores STL que no sean vector y String no admiten el método de acceso de *(it+i), por lo que solo se puede enumerar de la siguiente manera :

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    st.insert(3);//将3插入st中
    st.insert(5);
    st.insert(2);
    st.insert(3);
    //注意:不支持it<st.end()写法
    for(set<int>::iterator it = st.begin();it!=st.end();it++)
        printf("%d ",*it);
    return 0;
}

inserte la descripción de la imagen aquí
Se puede encontrar que los elementos en el conjunto se ordenan automáticamente de forma incremental y se eliminan los elementos duplicados

3. insert()
insert(x) puede insertar x en el contenedor Set y aumentar automáticamente la clasificación y la deduplicación

4. find()
find(value) devuelve el iterador correspondiente al valor en el conjunto

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    for(int i = 1 ; i <=3 ; i++)
        st.insert(i);
    set<int>::iterator it = st.find(2);
    printf("%d",*it);
    return 0;
}

5, borrar ()

Elimine un solo elemento: st.erase(it), es el iterador del elemento a eliminar, que se puede usar junto con la función find(); st.erase(value), value es el valor del elemento para ser eliminado

Eliminar elementos en un intervalo: st.erase(primero,último), eliminar elementos en el intervalo [primero,último)

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    st.insert(20);
    st.insert(10);
    st.insert(40);
    st.insert(30);
    set<int>::iterator it = st.find(30);
    st.erase(it,st.end());//st.end()指向末尾元素的下一个位置,这里即删除30、40
    for(it = st.begin();it!=st.end();it++)
        printf("%d ",*it);
    return 0;
}

6. size()
se usa para obtener el número de elementos en el conjunto

7. clear()
se usa para borrar todos los elementos del conjunto

tres, cuerda

En el lenguaje C, la matriz de caracteres char str[] se usa generalmente para almacenar cadenas, y C++ introduce el tipo de cadena, que encapsula las funciones comunes de las cadenas. Para usar una cadena, debe agregar #include<cadena> y usar el espacio de nombres estándar (string.h y string son archivos de encabezado diferentes)

1. Definición de cadena:

string str;

string str1 = "abcd";

2. Acceso a contenido en cadena:
(1) Acceso por subíndice:

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str;
    cin>>str;
    for(int i = 0 ; i < str.length() ; i++)
        printf("%c",str[i]);
    return 0;
}

(2) Acceso a través de iteradores:

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str;
    cin>>str;
    for(string::iterator it = str.begin();it!=str.end();it++)
        printf("%c ",*it);
    return 0;
}

3. operator+=
puede empalmar directamente dos cadenas

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str1,str2,str3;
    cin>>str1;
    cin>>str2;
    str3 = str1+str2;
    cout<<str3;
    return 0;
}

4. Operador de comparación
Dos tipos de cadena pueden usar ==, !=, <, <=, >, >= para comparar el tamaño, y la regla de comparación es el orden del diccionario

5. length()/size()
length() devuelve la longitud de la cadena, es decir, el número de caracteres almacenados

6. insert()
insert(pos, cadena), inserta cadena en la posición pos

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str1,str2;
    cin>>str1;
    cin>>str2;
    str1.insert(2,str2);
    cout<<str1;
    return 0;
}

inserte la descripción de la imagen aquí
insert(it, it2, it3): es la posición de la cadena original a insertar, it2, it3 es el primer iterador de la cadena a insertar, indicando que la cadena [it2, it3) se inserta en la posición de él

7. erase()
elimina un solo elemento: str.erase(it) es el iterador del elemento a eliminar

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "abcdefg";
    str.erase(str.begin()+4);
    cout<<str;
    return 0;
}

Eliminar elementos en un intervalo: str.erase(primero,último), eliminar elementos en el intervalo [primero,último)

Eliminar elementos en un rango: str.erase(pos,longitud), donde pos es la posición inicial donde los elementos deben eliminarse y longitud es la cantidad de caracteres que se eliminarán

8. clear()
borra los datos en la cadena

9. substr()
substr(pos,len): a partir del bit pos, una cadena con una longitud de len

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Thank you for your smile.";
    cout<<str.substr(0,5)<<endl;//Thank
    cout<<str.substr(14,4)<<endl;//your
    cout<<str.substr(19,5)<<endl;//smile
    return 0;
}

10. string::npos
string::npos es una constante, su valor en sí mismo es -1, pero debido a que es un tipo int sin signo, también puede considerarse como el valor máximo de int sin signo. Se utiliza como el valor de retorno de la falta de coincidencia de la función find ()

11. find()
str.find(str2): cuando str2 es una cadena de str, devuelve su posición de primera aparición en str, si str2 no es una cadena de str, devuelve string::npos

str.find(str2, pos): comience a hacer coincidir str2 desde la posición pos de str, el valor de retorno es el mismo que el anterior

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Thank you for your smile.";
    string str2 = "you";
    if(str.find(str2)!=string::npos){
        cout<<str.find(str2)<<endl;
    }
    return 0;
}

12. replace()
str.replace(pos, len, str2): reemplaza str con una cadena que comienza en pos y tiene una longitud de len str2 str.replace
(it1, it2, str2): reemplaza el iterador de str [it1, it2) bit de reemplazo de cadena str2 en el rango

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Maybe you will turn around.";
    string str2 = "will not";
    string str3 = "surely";
    cout<<str.replace(10,4,str2)<<endl;
    cout<<str.replace(str.begin(),str.begin()+5,str3);
    return 0;
}

inserte la descripción de la imagen aquí

cuatro, mapa

map se traduce como mapeo. map puede asignar cualquier tipo primitivo (incluidos los contenedores STL) a cualquier tipo primitivo (incluidos los contenedores STL). Para usar el mapa, debe agregar el archivo de encabezado #include<mapa> y usar el espacio de nombres estándar;

1. definición de mapa

map<typename1,typename2> mp; //第一个是键的类型,第二个是值的类型,键是唯一的

Si se trata de una asignación de cadena a entero, debe usar una cadena en lugar de una matriz de caracteres

map<string,int> mp;

Acceso a elementos del mapa:
(1) Acceso por clave (la clave es única):

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['c'] = 20;
    mp['c'] = 30;
    printf("%d\n",mp['c']);//30
    return 0;
}

(2) Acceso a través de iteradores

map<typename1,typename2>::iterator it;

Acceda a las teclas a través de it->primero, acceda a los valores a través de it->segundo

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['m'] = 20;
    mp['r'] = 30;
    for(map<char,int>::iterator it = mp.begin();it!=mp.end();it++){
        printf("%c %d\n",it->first,it->second);
    }
    return 0;
}

Las claves del mapa se ordenarán automáticamente de menor a mayor

3. find():
find(key) devuelve el iterador del mapa cuya clave es key

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['m'] = 20;
    mp['r'] = 30;
    map<char,int>::iterator it = mp.find('m');
    printf("%c %d\n",it->first,it->second);//m 20
    return 0;
}

4. erase()
elimina un solo elemento: mp.erase(it) es el iterador del elemento de que se eliminará

Eliminar un solo elemento: mp.erase(clave): clave es la clave de la asignación que se eliminará

Eliminar elementos en un rango: mp.erase (primero, último), tanto el primero como el último son iteradores, y el rango de elementos eliminados es [primero, último]

5. size()
obtiene el logaritmo mapeado en el mapa

6. clear()
borra todos los elementos del mapa

Usos comunes:

  • Preguntas que necesitan establecer un mapeo entre caracteres o cadenas y números enteros
  • Para juzgar si existen números enteros grandes u otros tipos de datos, el mapa se puede usar como una matriz bool

Nota: Las claves y los valores del mapa están en correspondencia uno a uno. Si desea que una clave corresponda a múltiples valores, debe usar multimapa

Supongo que te gusta

Origin blog.csdn.net/weixin_46025531/article/details/122797322
Recomendado
Clasificación