Directorio de artículos
Parte I Atención
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
map
Puntos a tener en cuenta al usar :
- añadir cita
#include <map>
map
Además del archivo de encabezado,map
también haymultimap
; además,unordered_map
hay contenedores similares en el archivo de encabezadounordered_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;
map
Los 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 map
las 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:
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 key el número de ocurrencias de la clave, map donde 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.first y 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.second upper_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