Как да използвате C ++ неупотребена карта

How Use C Unordered Map



Карта, известна още като асоциативен масив, е списък с елементи, където всеки елемент е двойка ключ/стойност. Така че всеки ключ съответства на стойност. Различните ключове могат да имат една и съща стойност за обикновена работа. Например, ключовете могат да бъдат списък с плодове и съответните стойности, цветовете на плодовете. В C ++ картата е реализирана като структура от данни с функции -членове и оператори. Подредена карта е тази, в която двойките елементи са подредени по ключове. Неподредена карта е тази, в която няма ред. Тази статия обяснява как да използвате C ++ неподредена карта, написана като unordered_map. За да разберете тази статия, ви трябват познания в C ++ указатели. unordered_map е част от стандартната библиотека на C ++.

Клас и обекти

Класът е набор от променливи и функции, които работят заедно, където променливите нямат присвоени стойности. Когато стойностите са присвоени на променливите, класът се превръща в обект. Различни стойности, дадени на един и същи клас, водят до различни обекти; тоест различните обекти са един и същи клас с различни стойности. Създаването на обект от клас се казва за създаване на обект.







Името, unordered_map, е клас. Обект, създаден от класа unordered_map, има име, избрано от програмист.



Функция, която принадлежи на клас, е необходима за създаване на обект от класа. В C ++ тази функция има същото име като името на класа. Обектите, създадени (създадени) от класа, имат различни имена, дадени им от програмиста.



Създаване на обект от класа означава конструиране на обекта; това също означава създаване на екземпляр.





Програма на C ++, която използва класа unordered_map, започва със следните редове в горната част на файла:

#включва
#включва
използвайки пространство за имена std;

Първият ред е за вход/изход. Вторият ред е да позволи на програмата да използва всички функции на класа unordered_map. Третият ред позволява на програмата да използва имената в стандартното пространство от имена.



Претоварване на функция

Когато два или повече различни подписи на функции имат едно и също име, това име се казва претоварено. Когато се извика една функция, броят и видът на аргументите определят коя функция действително се изпълнява.

Строителство/Копиране Конструиране

Проста конструкция

Неподредена карта може да бъде конструирана и да й се присвоят стойности, както следва:

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

umap['банан'] = 'жълт';
umap['гроздов'] = 'зелен';
umap['смокиня'] = 'лилаво';

Декларацията започва със специализация на шаблона с типовете за двойките ключ и стойност. Това е последвано от избраното от програмиста име за картата; след това точка и запетая. Вторият кодов сегмент показва как се присвояват стойности на техните ключове.
Изграждане по Initializer_list
Това може да стане по следния начин:

unordered_map<const char*, const char*>umap({{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}});

Изграждане чрез присвояване на Initializer_list
Пример:

unordered_map<const char*, const char*>umap= {{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}};

Конструиране чрез копиране на друга unordered_map
Пример:

unordered_map<const char*, const char*>umap1({{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}});
unordered_map<const char*, const char*>umap2(umap1);

Двойката Element

Следният код показва как да създадете и осъществите достъп до елемента на двойката:

чифт<char, const char*>пр= {'д', 'бъда'};
цена<<пр.първо << 'н';
цена<<пр.второ << 'н';

Изходът е:

д
бъда

първата и втората са запазени думи за двата елемента в двойката. Стойностите в двойката все още могат да се променят с помощта на първа и втора.

Извиква се двойка, value_type в темата за неподредената карта.

unordered_map Достъп до елемент

mapped_type & operator [] (key_type && k)
Връща стойността за съответния ключ. Пример:

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

umap['банан'] = 'жълт';
umap['гроздов'] = 'зелен';
umap['смокиня'] = 'лилаво';

const char *надясно=umap['гроздов'];

цена<<надясно<<'н';

Изходът е: зелен. Стойностите могат да бъдат присвоени по същия начин - вижте по -горе.

unordered_map Капацитет

size_type size () const noexcept
Връща броя на двойките в картата.

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

umap['банан'] = 'жълт';
umap['гроздов'] = 'зелен';
umap['смокиня'] = 'лилаво';

цена<<umap.размер() <<'н';

Изходът е 3.

bool empty () const noexcept

Връща 1 за true, ако картата няма двойка, и 0 за false, ако има двойки. Пример:

unordered_map<const char*, const char*>umap;
цена<<umap.празна() <<'н';

Изходът е 1.

Връщащи се итератори и клас с неподредена карта

Итераторът е като показалец, но има повече функционалност от показалеца.

begin () noexcept

Връща итератор, който сочи към първата двойка на обекта на картата, както в следния кодов сегмент:

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

umap['банан'] = 'жълт';umap['гроздов'] = 'зелен';umap['смокиня'] = 'лилаво';

unordered_map<const char*, const char*> ::итераторiter=umap.започнете();
чифт<const char*, const char*>пр= *iter;
цена<<пр.първо << ',' <<пр.второ << 'н';

Изходът е: смокиня, лилаво. Картата не е подредена.

begin () const noexcept;

Връща итератор, който сочи към първия елемент от колекцията обекти на картата. Когато конструирането на обекта се предхожда от const, изразът begin () const се изпълнява вместо begin (). При това условие елементите в обекта не могат да бъдат променяни. Използва се например в следния код.

constunordered_map<const char*, const char*>umap({{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}});

unordered_map<const char*, const char*> ::const_iteratoriter=umap.започнете();
чифт<const char*, const char*>пр= *iter;
цена<<пр.първо << ',' <<пр.второ << 'н';

Изходът е: смокиня, лилаво. Картата не е подредена. Обърнете внимание, че този път const_iterator е бил използван вместо само итератор, за да получи върнатия итератор.

end () noexcept

Връща итератор, който сочи непосредствено от последния елемент на обекта на картата.

end () const noexcept

Връща итератор, който сочи непосредствено от последния елемент на обекта на картата. Когато конструкцията на обекта на картата се предхожда от const, изразът end () const се изпълнява вместо end ().

unordered_map Операции

намиране на итератор (const key_type & k)

Търси чифт от дадения ключ в картата. Ако бъде намерен, той връща итератора. Ако не бъде намерен, той връща итератор, който сочи към края на картата, който не е двойка. Следният код показва как да използвате тази функция член:

unordered_map<char,char>umap;

umap['да се'] = 'b';umap['° С'] = 'д';umap['И'] = 'f';

unordered_map<char,char> ::итераторiter=umap.намирам('° С');
ако (umap.намирам('° С') ! =umap.край())
{
чифт<char,char>пр= *iter;
цена<<пр.първо << ',' <<пр.второ << 'н';
}

Изходът е: c, d

const_iterator find (const key_type & k) const;

Тази версия на функцията се извиква, ако създаването на неподредена карта започва с const, което прави всички елементи на картата само за четене.

unordered_map Модификатори

двойка вмъкване (value_type && obj)
Неподредената карта означава, че двойките не са в никакъв ред. Така че програмата вмъква двойката на всяко място, което намери за удобно. Функцията се връща, чифт. Ако вмъкването е било успешно, bool ще бъде 1 за true, в противен случай ще бъде 0 за false. Ако вмъкването е успешно, итераторът ще посочи ново вмъкнатия елемент. Следният код илюстрира използването:

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

umap['банан'] = 'жълт';
umap['гроздов'] = 'зелен';
umap['смокиня'] = 'лилаво';

umap.вмъкване({{'череша', 'мрежа'}, {'ягода', 'мрежа'}});

цена<<umap.размер() << 'н';

Изходът е: 5. Повече от една двойка може да бъде поставена.

size_type изтриване (const key_type & k)

Тази функция изтрива двойка от unordered_map. Следният кодов сегмент илюстрира:

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

umap['банан'] = 'жълт';
umap['гроздов'] = 'зелен';
umap['смокиня'] = 'лилаво';

intникой=umap.изтрива('гроздов');

цена<<umap.размер() << 'н';

Изходът е 2.
void swap (unordered_map &)
Две неподредени карти могат да бъдат разменени, както е илюстрирано в този кодов сегмент:

unordered_map<const char*, const char*>umap1= {{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}, {'ягода', 'мрежа'}};

unordered_map<const char*, const char*>umap2= {{'череша', 'мрежа'}, {'вар', 'зелен'}};

umap1.размяна(umap2);

unordered_map<const char*, const char*> ::итераторiter1=umap1.започнете();
чифт<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::итераторiter2=umap2.започнете();
чифт<const char*, const char*>pr2= *iter2;

цена<< 'Първият ключ и размер на umap1:'<<pr1.първо <<','<<umap1.размер() << 'н';
цена<< 'Първият ключ и размер на umap2'<<pr2.първо <<','<<umap2.размер() << 'н';
unordered_map<const char*, const char*>umap1= {{'банан', 'жълт'},
{'гроздов', 'зелен'}, {'смокиня', 'лилаво'}, {'ягода', 'мрежа'}};
unordered_map<const char*, const char*>umap2= {{'череша', 'мрежа'}, {'вар', 'зелен'}};

umap1.размяна(umap2);

unordered_map<const char*, const char*> ::итераторiter1=umap1.започнете();
чифт<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::итераторiter2=umap2.започнете();
чифт<const char*, const char*>pr2= *iter2;

цена<< 'Първият ключ и размер на umap1:'<<pr1.първо <<','<<umap1.размер() << 'н';
цена<< 'Първият ключ и размер на umap2'<<pr2.първо <<','<<umap2.размер() << 'н';

Изходът е:

Първи ключ и размер на umap1: вар, 2

Първи ключ и размер на ягода umap2, 4

Картата не е подредена. Имайте предвид, че дължината на картата се увеличава, ако е необходимо. Типовете данни трябва да са еднакви.

Класът и неговите инстанцирани обекти

Стойността е за тип данни, както създаденият обект е за клас. Неподредената конструкция на картата може също да приеме клас като тип данни. Следната програма илюстрира това:

#включва
#включва
използвайки пространство за имена std;

клас TheCla
{
обществен:
intникой;
статичен charгл;

невалиденфункция(charне, const char *стр)
{
цена<< 'Има ' <<никой<< 'книги на стойност' <<не<<стр<< ' в магазина.' << 'н';
}
статичен невалидензабавно(charгл)
{
ако (гл== 'да се')
цена<< „Официална статична функция -член“ << 'н';
}
};

intглавен()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<const char*,TheCla>umap;
umap= {{'банан',obj1}, {'гроздов',obj2}, {'смокиня',obj3}, {'ягода',obj4}, {'вар',obj5}};

цена<<umap.размер() << 'н';

връщане 0;
}

Изходът е: 5.

Дефиницията на класа има два публични члена на данни и две публични функции -членове. Във функцията main () се създават различни обекти за класа. След това се създава неподредена карта, където всяка двойка се състои от името на плод и обект от класа. Показва се размерът на картата. Програмата се компилира без предупреждение или съобщение за грешка.

Приложение на картата

Масивът свързва индекс към стойност. Двойките ключ/стойност съществуват в много ситуации в живота, които могат да бъдат програмирани. Двойката ключ/стойност плод/цвят е само един пример. Друг пример е името на хората и тяхната възраст. В този случай двойката ще бъде от тип, двойка. Може да бъде и чифт. Във втория случай ще бъде приложена директивата за предварителна обработка. Двойка ключ/стойност все още могат да бъдат имената на семейни двойки. В страни, където има многоженство, ще има различни съпруги за един мъж.

Формиране на карта

Картата не е двуизмерен масив, с две колони. Карта работи с хеш функция. Ключът е кодиран от хеш функцията, в цяло число на масив. Този масив съдържа стойностите. Така че, всъщност има един масив със стойностите и ключовете са съпоставени с индексите на масива и така се правят съответствията между ключовете и стойностите. Хеширането е обширна тема и не се разглежда в тази статия.

Заключение

Карта, известна още като асоциативен масив, е списък с елементи, където всеки елемент е двойка ключ/стойност. Така че всеки ключ съответства на стойност. В C ++ картата е реализирана като структура от данни с функции -членове и оператори. Подредена карта е тази, в която двойките елементи са подредени по ключове. Неподредена карта е тази, в която няма подреждане.

Технически хеш се състои от двойки елементи. Всъщност двойката представлява цялостна структура от данни със своите функции -членове и оператори. Двата параметъра на шаблона за двойката са едни и същи параметри на шаблона за unordered_map.

Initilizer_list за картата е литерал на масиви от литерали. Всеки вътрешен литерал се състои от два обекта, двойката ключ/стойност.

Функциите -членове и операторите за unordered_map могат да бъдат категоризирани в следните заглавия: unordered_map конструкция/копиране, unordered_map Capacity, unordered_map итератор, unordered_map операции и unordered_map модификатори.

Неподредена карта се използва, когато ключът трябва да бъде съпоставен със стойност.

Крис