Com s'utilitza el mapa sense ordenar C ++

How Use C Unordered Map



Un mapa, també conegut com a matriu associativa, és una llista d'elements, on cada element és un parell clau / valor. Per tant, cada clau correspon a un valor. Diferents claus poden tenir el mateix valor per al treball normal. Per exemple, les tecles poden ser una llista de fruites i els valors corresponents, els colors de les fruites. A C ++, el mapa s’implementa com una estructura de dades amb funcions i operadors membres. Un mapa ordenat és aquell on els parells d’elements s’han ordenat per claus. Un mapa sense ordenar és aquell on no hi ha ordre. En aquest article s'explica com utilitzar el mapa sense ordenar C ++, escrit com a unordered_map. Necessiteu coneixements sobre els indicadors C ++ per entendre aquest article. unordered_map forma part de la biblioteca estàndard C ++.

Classe i objectes

Una classe és un conjunt de variables i funcions que funcionen juntes, on les variables no tenen assignats valors. Quan s’assignen valors a les variables, la classe es converteix en un objecte. Els diferents valors donats a una mateixa classe donen lloc a objectes diferents; és a dir, diferents objectes són la mateixa classe amb valors diferents. Es diu que la creació d’un objecte a partir d’una classe instancia l’objecte.







El nom, unordered_map, és una classe. Un objecte creat a partir de la classe unordered_map té un nom triat pel programador.



Es necessita una funció que pertany a una classe per crear un objecte de la classe. A C ++, aquesta funció té el mateix nom que el nom de la classe. Els objectes creats (instanciats) a partir de la classe tenen diferents noms donats pel programador.



Crear un objecte a partir de la classe significa construir l’objecte; també vol dir instàncies.





Un programa C ++ que utilitza la classe unordered_map comença amb les línies següents a la part superior del fitxer:

#incloure
#incloure
utilitzant l'espai de noms std;

La primera línia és per a l'entrada / sortida. La segona línia és permetre al programa utilitzar totes les funcions de la classe unordered_map. La tercera línia permet al programa utilitzar els noms a l’espai de noms estàndard.



Sobrecàrrega d'una funció

Quan dues o més signatures de funció diferents tenen el mateix nom, es diu que aquest nom està sobrecarregat. Quan es crida una funció, el nombre i el tipus d'arguments, determineu quina funció s'executa realment.

Construcció / Construcció de còpies

Construcció senzilla

Es pot construir un mapa sense ordenar i assignar valors de la següent manera:

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';
umap['raïm'] = 'verd';
umap['figa'] = 'porpra';

La declaració comença amb l’especialització de plantilla amb els tipus per als parells de claus i valors. Tot seguit, el nom escollit pel programador per al mapa; després un punt i coma. El segon segment de codi mostra com assignar valors a les seves claus.
Construcció per Initializer_list
Això es pot fer de la següent manera:

mapa_ordenat<const char*, const char*>umap({{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}});

Construcció assignant Initializer_list
Exemple:

mapa_ordenat<const char*, const char*>umap= {{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}};

Construcció copiant un altre mapa unordered_map
Exemple:

mapa_ordenat<const char*, const char*>umap1({{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}});
mapa_ordenat<const char*, const char*>umap2(umap1);

El parell Element

El codi següent mostra com crear i accedir a l'element parell:

parell<char, const char*>pr= {'d', 'Sigui'};
cost<<pr.primer << ' n';
cost<<pr.segon << ' n';

La sortida és:

d
sigui

primer i segon són paraules reservades per als dos elements del parell. Els valors del parell encara es poden canviar mitjançant el primer i el segon.

Es diu un parell, value_type, al tema del mapa no ordenat.

unordered_map Accés a l'element

mapped_type & operator [] (key_type && k)
Retorna el valor de la clau corresponent. Exemple:

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';
umap['raïm'] = 'verd';
umap['figa'] = 'porpra';

const char *dret=umap['raïm'];

cost<<dret<<' n';

La sortida és: verda. Els valors es poden assignar de la mateixa manera: vegeu més amunt.

unordered_map Capacitat

size_type size () const no excepte
Retorna el nombre de parells al mapa.

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';
umap['raïm'] = 'verd';
umap['figa'] = 'porpra';

cost<<umap.mida() <<' n';

La sortida és 3.

bool empty () const noexcept

Retorna 1 per a cert si el mapa no té parell i 0 per a fals si té parells. Exemple:

mapa_ordenat<const char*, const char*>umap;
cost<<umap.buit() <<' n';

La sortida és 1.

Iteradors retornats i la classe de mapes no ordenats

Un iterador és com un punter però té més funcionalitats que el punter.

begin () noexcept

Retorna un iterador que apunta al primer parell de l'objecte del mapa, com al segment de codi següent:

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';umap['raïm'] = 'verd';umap['figa'] = 'porpra';

mapa_ordenat<const char*, const char*> ::iteradoriter=umap.començar();
parell<const char*, const char*>pr= *iter;
cost<<pr.primer << ',' <<pr.segon << ' n';

La sortida és: figa, porpra. El mapa no està ordenat.

begin () const noexcept;

Retorna un iterador que apunta al primer element de la col·lecció d'objectes del mapa. Quan la construcció de l'objecte va precedida de const, l'expressió begin () const s'executa en lloc de begin (). En aquesta condició, els elements de l'objecte no es poden modificar. S'utilitza al codi següent, per exemple.

constmapa_ordenat<const char*, const char*>umap({{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}});

mapa_ordenat<const char*, const char*> ::const_iteratoriter=umap.començar();
parell<const char*, const char*>pr= *iter;
cost<<pr.primer << ',' <<pr.segon << ' n';

La sortida és: figa, porpra. El mapa no està ordenat. Tingueu en compte que aquesta vegada s’ha utilitzat const_iterator, en lloc de només iterador, per rebre l’iterador retornat.

end () sense excepte

Retorna un iterador que apunta immediatament més enllà de l'últim element de l'objecte del mapa.

end () const noexcept

Retorna un iterador que apunta immediatament més enllà de l'últim element de l'objecte del mapa. Quan la construcció de l'objecte del mapa va precedida de const, l'expressió end () const s'executa en lloc de end ().

unordered_map Operacions

cerca iterador (const key_type & k)

Cerca un parell de la clau donada al mapa. Si es troba, retorna l'iterador. Si no es troba, retorna un iterador que apunta al final del mapa, que no és un parell. El codi següent mostra com utilitzar aquesta funció membre:

mapa_ordenat<char,char>umap;

umap['A'] = 'B';umap['C'] = 'd';umap['I'] = 'f';

mapa_ordenat<char,char> ::iteradoriter=umap.trobar('C');
si (umap.trobar('C') ! =umap.final())
{
parell<char,char>pr= *iter;
cost<<pr.primer << ',' <<pr.segon << ' n';
}

La sortida és: c, d

const_iterator find (const key_type & k) const;

Aquesta versió de la funció s’anomena, si la creació del mapa no ordenat comença per const, fent que tots els elements del mapa siguin de només lectura.

unordered_map Modificadors

inserció de parells (tipus_valor && obj)
Un mapa no ordenat significa que les parelles no estan en cap ordre. Per tant, el programa insereix el parell en qualsevol lloc que consideri convenient. La funció torna, parella. Si la inserció ha estat correcta, bool serà 1 per a cert, en cas contrari seria 0 per a fals. Si la inserció és correcta, l'iterador assenyalarà l'element acabat d'inserir. El següent codi il·lustra l’ús:

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';
umap['raïm'] = 'verd';
umap['figa'] = 'porpra';

umap.inserir({{'cirera', 'Xarxa'}, {'maduixa', 'Xarxa'}});

cost<<umap.mida() << ' n';

La sortida és: 5. Es poden inserir més d'un parell.

esborrar size_type (const key_type & k)

Aquesta funció esborra un parell del mapa unordered_map. El següent segment de codi il·lustra:

mapa_ordenat<const char*, const char*>umap;

umap['plàtan'] = 'groc';
umap['raïm'] = 'verd';
umap['figa'] = 'porpra';

inten un=umap.esborrar('raïm');

cost<<umap.mida() << ' n';

La sortida és 2.
intercanvi buit (unordered_map &)
Es poden intercanviar dos mapes no ordenats, tal com es mostra en aquest segment de codi:

mapa_ordenat<const char*, const char*>umap1= {{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}, {'maduixa', 'Xarxa'}};

mapa_ordenat<const char*, const char*>umap2= {{'cirera', 'Xarxa'}, {'Lima', 'verd'}};

umap1.intercanviar(umap2);

mapa_ordenat<const char*, const char*> ::iteradoriter1=umap1.començar();
parell<const char*, const char*>pr1= *iter1;
mapa_ordenat<const char*, const char*> ::iteradoriter2=umap2.començar();
parell<const char*, const char*>pr2= *iter2;

cost<< 'Primera clau i mida de umap1:'<<pr1.primer <<','<<umap1.mida() << ' n';
cost<< 'Primera clau i mida d'umap2'<<pr2.primer <<','<<umap2.mida() << ' n';
mapa_ordenat<const char*, const char*>umap1= {{'plàtan', 'groc'},
{'raïm', 'verd'}, {'figa', 'porpra'}, {'maduixa', 'Xarxa'}};
mapa_ordenat<const char*, const char*>umap2= {{'cirera', 'Xarxa'}, {'Lima', 'verd'}};

umap1.intercanviar(umap2);

mapa_ordenat<const char*, const char*> ::iteradoriter1=umap1.començar();
parell<const char*, const char*>pr1= *iter1;
mapa_ordenat<const char*, const char*> ::iteradoriter2=umap2.començar();
parell<const char*, const char*>pr2= *iter2;

cost<< 'Primera clau i mida de umap1:'<<pr1.primer <<','<<umap1.mida() << ' n';
cost<< 'Primera clau i mida d'umap2'<<pr2.primer <<','<<umap2.mida() << ' n';

La sortida és:

Primera clau i mida de umap1: calç, 2

Primera clau i mida de maduixa umap2, 4

El mapa no està ordenat. Tingueu en compte que la longitud d’un mapa s’incrementa si cal. Els tipus de dades han de ser els mateixos.

Class i els seus objectes instantanis

Un valor correspon a un tipus de dades, com un objecte instantani a una classe. La construcció de mapes sense ordenar també pot acceptar una classe com a tipus de dades. El programa següent ho il·lustra:

#incloure
#incloure
utilitzant l'espai de noms std;

classe TheCla
{
públic:
inten un;
estàtic charcap;

buitfunció(charno, const char *pàg)
{
cost<< 'Hi ha' <<en un<< 'val la pena els llibres' <<no<<pàg<< 'a la botiga'. << ' n';
}
estàtic buitdiversió(charcap)
{
si (cap== 'A')
cost<< 'Funció de membre estàtic oficial' << ' n';
}
};

intprincipal()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

mapa_ordenat<const char*,TheCla>umap;
umap= {{'plàtan',obj1}, {'raïm',obj2}, {'figa',obj3}, {'maduixa',obj4}, {'Lima',obj5}};

cost<<umap.mida() << ' n';

tornar 0;
}

La sortida és: 5.

La definició de classe té dues dades de membres públics i dues funcions de membre públic. A la funció main (), s’instancien diferents objectes de la classe. A continuació, s’instancia un mapa sense ordenar, on cada parella consisteix en el nom d’una fruita i un objecte de la classe. Es mostra la mida del mapa. El programa es compila sense cap missatge d’avís ni d’error.

Aplicació del mapa

La matriu associa un índex al valor. Els parells clau / valor existeixen en moltes situacions de la vida, que es poden programar. El parell clau / valor de fruita / color és només un exemple. Un altre exemple és el nom de les persones i les seves edats. En aquest cas, el parell serà d’un tipus, parell. També pot ser parell. En aquest darrer cas, s’utilitzarà la directiva de pre-processament. Una parella clau / valor encara pot ser el nom de les parelles casades. Als països on hi ha poligàmia, hi haurà diferents esposes per a un home.

Formació d’un mapa

Un mapa no és una matriu bidimensional, amb dues columnes. Un mapa funciona amb una funció hash. La clau està codificada per la funció hash en un enter d'una matriu. És aquesta matriu la que conté els valors. Per tant, en realitat hi ha una matriu amb els valors i les claus s’assignen als índexs de la matriu, de manera que es fan les correspondències entre claus i valors. Hashing és un tema extens i no es tracta en aquest article.

Conclusió

Un mapa, també conegut com a matriu associativa, és una llista d'elements, on cada element és un parell clau / valor. Per tant, cada clau correspon a un valor. A C ++, el mapa s’implementa com una estructura de dades amb funcions i operadors membres. Un mapa ordenat és aquell on els parells d’elements s’han ordenat per claus. Un mapa sense ordenar és aquell on no hi ha cap ordre.

Tècnicament, un hash consisteix en elements de parella. De fet, el parell és tota una estructura de dades amb les seves funcions i operadors membres. Els dos paràmetres de plantilla per al parell són els mateixos dos paràmetres de plantilla per a unordered_map.

La llista inicialitzadora del mapa és una matriu literal de literals. Cada literal intern consta de dos objectes, el parell clau / valor.

Les funcions i operadors de membres per a unordered_map es poden classificar en els títols següents: construcció unordered_map / construcció de còpia, unordered_map Capacity, unordered_map iterator, unordered_map Operations i unordered_map Modificadors.

Un mapa no ordenat s’utilitza quan s’ha de mapar una clau a un valor.

Chrys