[Plan de desarrollo de 21 días de C ++] Asignación de mapas STL y multimapa de inicio rápido de clase (día 17)

¡Hola a todos! Soy [bacteria AI], un programador al que le encanta tocar la guitarra. Me 热爱AI、热爱分享、热爱开源! Este blog es mi resumen y reflexión sobre el aprendizaje. Si también está 深度学习、机器视觉、算法、Python、C++interesado, puede concentrarse en mi dinámica, aprendemos juntos y progresamos juntos -
la dirección de mi blog es: [AI] bacterias del blog
la dirección de mi proyecto Github es: [AI] de bacterias Github


1. Introducción a la clase de mapas STL

map y multimap son contenedores de pares clave-valor que admiten búsquedas basadas en claves, similar a la clase de diccionario en la estructura de datos.

Tanto map como multimup son clases de plantilla, la diferencia entre ellas es que multimap puede almacenar claves duplicadas , mientras que el primero solo puede almacenar claves únicas .

Para lograr una búsqueda rápida, la estructura interna de map y multimap parece un árbol binario . Esto significa que al insertar elementos en map y multimap, se ordenarán . También significa que no se pueden usar otros elementos para reemplazar elementos en una posición determinada como un vector. Un elemento en una posición específica en el mapa no se puede reemplazar con un elemento nuevo con un valor diferente. Esto se debe a que el mapa comparará el nuevo elemento con otros elementos en el árbol binario. Y luego colóquelo en otra ubicación.

Además, debe tenerse en cuenta que al usar el mapa STL y las clases multimapa, debe incluir el archivo de encabezado:

# include<map>

Inserte la descripción de la imagen aquí

2. Operaciones básicas de las clases de mapas y multimapas

2.1 Operación de instanciación

La sintaxis típica de creación de instancias de mapas es la siguiente:

map <keyType, valueType, Predicate=std::less <keyType> > mapObject;
multimap <keyType, valueType, Predicate=std::greater <keyType> >mmapObject;
  • El primer parámetro keyType representa el tipo de clave
  • El segundo parámetro valueType representa el tipo de valor
  • El tercer parámetro menor / mayor se utiliza como criterio de clasificación . Menos es ordenar en orden ascendente y mayor es ordenar en orden descendente.

A continuación se utilizan varios métodos diferentes para crear una instancia de un mapa o multimapa del tipo par clave-valor {cadena, int}.

#include <iostream>
#include <map>
#include <string>

using namespace std;
template<typename KeyType>

int main()
{
    
    
	// 方法1
    map<int, string> map1;
    multimap<int, string> mmap1;
	// 方法2
    map<int, string> map2(map1);
    multimap<int, string> mmap2(mmap1);
	// 方法3
    map<int, string> map3(map1.cbegin(), map1.cend());
    multimap<int, string> mmap3(mmap1.cbegin(), mmap1.cend());    

    return 0;
}

2.2 Dos métodos de clasificación

En el proceso de instanciar map y multimap, si no se especifica ningún predicado de clasificación, map clasificará los elementos en orden ascendente por defecto .

Para personalizar los criterios de clasificación del mapa, podemos utilizar los dos métodos siguientes:

(1) Utilice los predicados cada vez mayores proporcionados por la clase de mapa para determinar los criterios de clasificación

// 1.升序 
map<int, string, less<int>> map1;
// 2.降序
multimap<int, string, greater<int>> mmap1;

(2) Los predicados personalizados se utilizan como criterios de clasificación

#include <iostream>
#include <map>
#include <string>

using namespace std;
template<typename KeyType>

// 自定义词谓
struct ReverseSort
{
    
    
    bool operator()(const KeyType& key1, const KeyType& key2)
    {
    
    
        return (key1 > key2);
    }
};

int main()
{
    
    
	// 实例化
    map<int, string> map1;
    multimap<int, string> mmap1;
    
	// 降序排列
    map<int, string, ReverseSort<int>> map5(map1.cbegin(), map1.cend());
    multimap<int, string, ReverseSort<int>> mmap5(mmap1.cbegin(), mmap1.cend());
    
    return 0;
}

3. Funciones miembro de las clases de mapas y multimapas

2.1 Insertar función de elemento insertar ()

Con la función de miembro del mapa insert (), puede insertar nuevos pares clave-valor en el mapa; a continuación, se muestran 4 métodos de inserción comunes:

#include <iostream>
#include <map>
#include <string>

using namespace std;
template <typename T>

// 显示内容
void DisplayContents(const T& Input)
{
    
    
    for(auto iElement = Input.cbegin(); iElement != Input.cend(); ++iElement)
        cout<<iElement->first<<"  "<<iElement->second<<endl;
    cout<<endl;
}

int main()
{
    
    
    map<int, string, less<int>>map1;
    // 插入方法1
    map1.insert(map<int, string>::value_type(3, "Three"));
    // 插入方法2
    map1.insert(make_pair(1, "One"));
    // 插入方法3
    map1.insert(pair<int, string>(10, "Ten"));
  
    // 插入方法4,采用类似于数组的语法进行插入。
    map1[8] = "Eight";

    cout<<"键 :值"<<endl;
    DisplayContents(map1);

    return 0;
}

Después de cuatro inserciones de la clase, hay cuatro pares clave-valor en el mapa, como se muestra a continuación:

Inserte la descripción de la imagen aquí

2.2 Encuentra la función del elemento find ()

map y multimap proporcionan la función miembro find (), que puede encontrar un valor basado en una clave dada .

Lo que devuelve find () es un iterador, como se muestra a continuación:

map1 <int, string>::const_iterator iFound = map1.find(Key);

Cuando use find () para encontrar un elemento, primero verifique el iterador para asegurarse de que find () sea exitoso, y luego utilícelo para acceder al valor encontrado :

if(iFound != map1.end())
{
    
    
	cout<<"键 :值"<<endl;
	cout<<iFound->first<<" "<<iFound->second<<endl;
}
else
	cout<<"Key不存在于map中!"<<endl;

A continuación se muestra un ejemplo práctico, usando la función miembro find () para encontrar el valor correspondiente a la clave en map1:

#include <iostream>
#include <map>
#include <string>

using namespace std;
template <typename T>

// 显示内容
void DisplayContents(const T& Input)
{
    
    
    for(auto iElement = Input.cbegin(); iElement != Input.cend(); ++iElement)
        cout<<iElement->first<<"  "<<iElement->second<<endl;
    cout<<endl;
}

int main()
{
    
    
    map<int, string, less<int>>map1;
    // 插入元素
    map1.insert(make_pair(8, "Eight"));
    map1.insert(make_pair(1, "One"));
    map1.insert(make_pair(6, "Six"));
    map1.insert(make_pair(10, "Ten"));
    // 显示键值
    cout<<"键 :值"<<endl;
    DisplayContents(map1);
    // 根据键查找其对应的值
    auto iFound = map1.find(8);
    if(iFound != map1.end())
        cout<<iFound->first<<"对应的值是:"<<iFound->second<<endl;
    else
        cout<<"Key不存在于map1中!"<<endl;

    return 0;
}

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí
Si está utilizando un mapa múltiple, el contenedor puede contener varios pares clave-valor con la misma clave , por lo que debe encontrar todos los valores correspondientes a la clave especificada . Por lo tanto, primero use count () para determinar cuántos valores corresponden a la clave especificada, y luego incremente el iterador para acceder a todos los valores correspondientes.

Hay 3 pares clave-valor idénticos en el siguiente mapa. La línea debe encontrar los pares clave-valor y generarlos a su vez:

#include <iostream>
#include <map>
#include <string>

using namespace std;
template <typename T>

// 显示内容
void DisplayContents(const T& Input)
{
    
    
    for(auto iElement = Input.cbegin(); iElement != Input.cend(); ++iElement)
        cout<<iElement->first<<"  "<<iElement->second<<endl;
    cout<<endl;
}

int main()
{
    
    
    multimap<int, string, less<int>>map1;
    // 插入元素
    map1.insert(make_pair(8, "Eight"));
    map1.insert(make_pair(1, "One"));
    map1.insert(make_pair(8, "Eight"));
    map1.insert(make_pair(8, "Eight"));
    
    // 显示键值
    cout<<"键 :值"<<endl;
    DisplayContents(map1);

    // 根据键查找其所有对应的值
    auto iFound = map1.find(8);
    if(iFound != map1.end())
    {
    
    
        // 统计multimap中键8出现的次数
        size_t num = map1.count(8);
        for(size_t nCounter=0; nCounter<num; ++nCounter)
        {
    
    
            cout<<"Key: "<<iFound->first<<", Val["<<nCounter<<"]="<<iFound->second<<endl;
            ++iFound;
        }
    }
    else
        cout<<"Element Not Found In The Map!";

    return 0;
}

resultado de la operación:
Inserte la descripción de la imagen aquí

2.3 Eliminar función de elemento borrar ()

map y multimap proporcionan la función miembro erase (), que se utiliza para eliminar elementos en el contenedor. Hay tres métodos principales:

  • Cuando se utiliza una clave como parámetro, se eliminarán todos los pares clave-valor que contengan la clave especificada
map1.erase(key);
  • Tome el iterador como parámetro, elimine el parámetro al que apunta el iterador
map1.erase(iFound);
  • Utilice el iterador para especificar el límite y eliminar todos los elementos en el rango especificado
map1.erase(iLowerBound, iUpperBound);

La siguiente es una demostración práctica del uso de los tres métodos anteriores:

#include <iostream>
#include <map>
#include <string>

using namespace std;
template <typename T>

// 显示内容
void DisplayContents(const T& Input)
{
    
    
    for(auto iElement = Input.cbegin(); iElement != Input.cend(); ++iElement)
        cout<<iElement->first<<"  "<<iElement->second<<endl;
    cout<<endl;
}

int main()
{
    
    
    multimap<int, string, less<int>>map1;
    // 插入元素
    map1.insert(make_pair(8, "Eight"));
    map1.insert(make_pair(1, "One"));
    map1.insert(make_pair(6, "Six"));
    map1.insert(make_pair(10, "Ten"));
    map1.insert(make_pair(15, "Fifteen"));


    // 显示键值
    cout<<"键 :值"<<endl;
    DisplayContents(map1);

    // 删除键1对应的键值对
    map1.erase(1);
    cout<<"删除键1对应的键值对后:"<<endl;
    DisplayContents(map1);

    // 删除迭代器指向的元素
    auto iFound = map1.find(8);
    map1.erase(iFound);
    cout<<"删除键8对应的键值对后:"<<endl;
    DisplayContents(map1);

    // 删除指定范围内(6至10)的元素
    map1.erase(map1.lower_bound(6), map1.lower_bound(15));
    cout<<"删除指定范围内(从6开始,到15之前)的元素:"<<endl;
    DisplayContents(map1);

    return 0;
}

resultado de la operación:
Inserte la descripción de la imagen aquí


El intercambio de hoy ha terminado, ¡espero que sea útil para su estudio!

Inserte la descripción de la imagen aquí

Finalmente, tuve la suerte de ser seleccionado en el concurso Top50 de blogs originales de CSDN. Si puedes votar por mí, ¡será el mayor estímulo para mi creación! Después de votar, ¡aún puede participar en la lotería oficial!

Canal de votación: concurso de blogs originales de CSDN
Inserte la descripción de la imagen aquí

¡Desarrolle un hábito, como primero y luego observe! ¡Tu apoyo es la mayor motivación para mi creación!

Supongo que te gusta

Origin blog.csdn.net/wjinjie/article/details/108710213
Recomendado
Clasificación