Explicación detallada del mapa de contenedores asociado de C++ STL

Parte I Atención

inserte la descripción de la imagen aquí
En C++, el mapa proporciona un contenedor de pares clave-valor, en el que los datos aparecen en pares, y el primer valor de cada par se denomina clave (clave), y cada clave solo se puede usar en el mapa Aparece una vez; el segundo se llama el valor correspondiente de la palabra clave (Valor).

Notas sobre el Cap.I

mapPuntos a tener en cuenta al usar :

  • añadir cita#include <map>
  • mapAdemás del archivo de encabezado, maptambién hay multimap; además, unordered_maphay contenedores similares en el archivo de encabezado unordered_map, unordered_multimap, y las diferencias entre ellos son las siguientes:
nombre significado
map En un mapa, la clave de valor clave generalmente se usa para identificar de manera única un elemento, y el valor de valor almacena el contenido asociado con la clave de valor clave; el tipo de clave de valor clave y el valor pueden ser diferentes, y dentro del mapa, el la clave y el valor se pasan a través de los miembros El tipo value_type está vinculado y se le otorga un alias pair; la clave en el mapa es única y no se puede modificar, y la inserción fallará si se encuentra una clave duplicada; pero []el valor puede ser modificado mediante el uso del operador, la implementación subyacente del mapa es el árbol negro rojo, la eficiencia de búsqueda es relativamente alta, sí O(logN);
multimap La diferencia con map es: la clave en multimap se puede repetir; no hay una []función de operador sobrecargada en multimap; para elementos repetidos, el primer elemento del recorrido en orden también se devuelve durante la búsqueda.
unordered_map Se almacenan elementos del tipo par clave-valor <key, value>, donde no se permite repetir los valores de cada clave de par clave-valor, y se desordenan los pares clave-valor almacenados en el contenedor.
unordered_multimap La única diferencia con unordered_map es que este contenedor permite almacenar múltiples pares clave-valor con la misma clave.
  • El ejemplo de constructor más básico:std::map<int, std::string> mapPerson;
  • mapLos elementos en se almacenan en un cierto orden, que se ordena en orden ascendente por clave de forma predeterminada;
map<T1, T2> m;	//默认按键的升序方式排列元素,相当于 map<T1, T2, less<T1>> m
map<T1, T2, less<T1>> m; //该容器是按键的升序方式排列元素。
map<T1, T2, greater<T1>> m;  //该容器是按键的降序方式排列元素。

Cap.II Habilidades Operativas

Estos son algunos ejemplos de operaciones:

// 用insert函數插入pair
mapStudent.insert(make_pair(000, "student_zero"));
// 用insert函數插入pair
mapStudent.insert({
    
    000, "student_zero"});
// 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
// 用"array"方式插入
mapStudent[123] = "student_first";
// 查找元素,没找到就返回 end
mapStudent.find("123")!=mapStudent.end()
// 根据键值删除元素,如果删除成功返回1,否则返回0
mapStudent.erase("123");
// 清空整个 map
mapStudent.erase(mapStudent.begin(), mapStudent.end());

Parte II Función

Solo maplas funciones aquí presentadas (las funciones de los otros tres mapas son similares a él, algunas tienen menos funciones o más funciones), como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

función significado
begin() Devuelve un iterador que apunta al encabezado del mapa (tenga en cuenta que está ordenado)
clear() eliminar todos los elementos
count(key) Devuelve keyel número de ocurrencias de la clave, mapdonde el valor máximo devuelto por esta función es 1
empty() Devuelve verdadero si el mapa está vacío
emplace() Construye un nuevo par clave-valor en la posición especificada en el contenedor del mapa actual. Su efecto es el mismo que insertar pares clave-valor, pero más eficiente.
end() Devuelve un iterador que apunta al final del mapa, tenga en cuenta que no es el último elemento, sino el final del contenedor, similar al char[]tipo en'\0'
equal_range() Este método devuelve un objeto de par (contiene dos iteradores bidireccionales), donde el valor de retorno del método pair.firsty son equivalentes, y el valor de retorno del método es equivalente. Es decir, este método devolverá un rango que contiene el par clave-valor cuya clave es clave (el par clave-valor del contenedor del mapa es único, por lo que el rango contiene como máximo un par clave-valor).lower_bound()pair.secondupper_bound()
erase() Elimine la ubicación especificada, el valor clave (clave) especificado o el par clave-valor en el área especificada del contenedor del mapa.
find(key) Busque el par clave-valor cuya clave es clave en el contenedor del mapa. Si se encuentra correctamente, devuelva un iterador bidireccional que apunte al par clave-valor; de lo contrario, devuelva el mismo iterador que el método end().
get_allocator() Devuelve el configurador para el mapa, comomap<string, int>::allocator_type
insert() insertar elemento
key_comp() Devuelve una función para comparar claves de elementos.
lower_bound(key) Devuelve un iterador bidireccional que apunta al primer par clave-valor mayor o igual que la clave en el contenedor del mapa actual
max_size() Devuelve el número máximo de elementos que puede contener
rbegin() Devuelve un iterador inverso que apunta al final del mapa.
rend() Devuelve un iterador inverso que apunta a la cabeza del mapa.
size() Devuelve el número de elementos en el mapa
swap() intercambiar dos mapas
upper_bound(key) Devuelve un iterador que apunta al primer par clave-valor mayor que la clave en el contenedor del mapa actual.
value_comp() Devuelve una función que compara el valor del elemento.

Parte III Código

Cap.I mapa

El código de prueba es el siguiente:

#include <iostream>
#include <iomanip>
#include <map>

using namespace std;

int main()
{
    
    
    map<string,int> data {
    
    {
    
    "Tom",10},{
    
    "Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data["Allice"]=30;
    data.insert({
    
    "Tony",10});
    cout<<data["Tony"] << endl;
    data.insert({
    
    "Tony",20}); // it can't work, data["Tony"]=20; is OK!
    cout<<data["Tony"] << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.rbegin();itr!=data.rend();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

La salida es la siguiente:

Jerry 20
10
10
Allice 30
4       97612893
Tony 10
Tom 10
Jerry 20
Allice 30

Cap.II mapa_desordenado

El código de prueba es el siguiente:

#include <iostream>
#include <iomanip>
#include <unordered_map>

using namespace std;

int main()
{
    
    
    unordered_map<string,int> data {
    
    {
    
    "Tom",10},{
    
    "Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data["Allice"]=30;
    data.insert({
    
    "Tony",10});
    cout<<data["Tony"] << endl;
    data.insert({
    
    "Tony",20}); // it can't work, data["Tony"]=20; is OK!
    cout<<data["Tony"] << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.begin();itr!=data.end();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

La salida es la siguiente:

Jerry 20
10
10
Tony 10
4      119304647
Tony 10
Allice 30
Jerry 20
Tom 10

Cap.III multimapa

El código de prueba es el siguiente:

#include <iostream>
#include <iomanip>
#include <map>

using namespace std;

int main()
{
    
    
    multimap<string,int> data {
    
    {
    
    "Tom",10},{
    
    "Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data.insert({
    
    "Allice",30});
    data.insert({
    
    "Tony",10});
    auto ret=data.equal_range("Tony");
    for(auto itr=ret.first;itr!=ret.second;itr++)
        cout<<itr->second<< " ";
    cout << endl;
    data.insert({
    
    "Tony",20}); // it work! data["Tony"]=20; is Error!
    ret=data.equal_range("Tony");
    for(auto itr=ret.first;itr!=ret.second;itr++)
        cout<<itr->second<< " ";
    cout << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.begin();itr!=data.end();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

La salida es la siguiente:

Jerry 20
10
10 20
Allice 30
5       97612893
Allice 30
Jerry 20
Tom 10
Tony 10
Tony 20

Supongo que te gusta

Origin blog.csdn.net/Gou_Hailong/article/details/128389898
Recomendado
Clasificación