C ++

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

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

Клас и обекти

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

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

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

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

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

#include
#include
използване на пространство от имена std;

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

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

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

Изграждане / Изграждане на копия

Просто строителство

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

unordered_map umap;
umap ["банан"] = "жълт";
umap ["грозде"] = "зелено";
umap ["fig"] = "лилаво";

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

unordered_map umap ("банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво");

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

unordered_map umap = "банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво";

Изграждане чрез копиране на друга unordered_map
Пример:

unordered_map umap1 ("банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво");
unordered_map umap2 (umap1);

Двойката Елемент

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

двойка pr = 'd', "море";
Cout << pr.first << '\n';
Cout << pr.second << '\n';

Резултатът е:

д
море

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

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

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

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

unordered_map umap;
umap ["банан"] = "жълт";
umap ["грозде"] = "зелено";
umap ["fig"] = "лилаво";
const char * ret = umap ["грозде"];
Cout << ret <<'\n';

Резултатът е: „зелен“. Стойностите могат да се задават по същия начин - вижте по-горе.

unordered_map Капацитет

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

unordered_map umap;
umap ["банан"] = "жълт";
umap ["грозде"] = "зелено";
umap ["fig"] = "лилаво";
Cout << umap.size() <<'\n';

Изходът е 3.

bool empty () const noexcept

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

unordered_map umap;
Cout << umap.empty() <<'\n';

Изходът е 1.

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

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

begin () noexcept

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

unordered_map umap;
umap ["банан"] = "жълт"; umap ["грозде"] = "зелено"; umap ["fig"] = "лилаво";
unordered_map:: итератор iter = umap.начало ();
двойка pr = * iter;
Cout << pr.first << ", " << pr.second << '\n';

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

begin () const noexcept;

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

const unordered_map umap ("банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво");
unordered_map:: const_iterator iter = umap.начало ();
двойка pr = * iter;
Cout << pr.first << ", " << pr.second << '\n';

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

end () noexcept

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

end () const noexcept

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

unordered_map Операции

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

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

unordered_map umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
unordered_map:: итератор iter = umap.намери ('c');
ако (umap.намери ('c') != umap.край())

двойка pr = * iter;
Cout << pr.first << ", " << pr.second << '\n';

Резултатът е: c, d

const_iterator намери (const key_type & k) const;

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

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

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

unordered_map umap;
umap ["банан"] = "жълт";
umap ["грозде"] = "зелено";
umap ["fig"] = "лилаво";
umap.вмъкване ("череша", "червено", "ягода", "червено");
Cout << umap.size() << '\n';

Резултатът е: 5. Могат да се вмъкнат повече от една двойка.

изтриване на размер_тип (const key_type & k)

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

unordered_map umap;
umap ["банан"] = "жълт";
umap ["грозде"] = "зелено";
umap ["fig"] = "лилаво";
int num = umap.изтриване ("грозде");
Cout << umap.size() << '\n';

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

unordered_map umap1 = "банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво", "ягода", "червено";
unordered_map umap2 = "череша", "червено", "лайм", "зелено";
umap1.суап (umap2);
unordered_map:: итератор iter1 = umap1.начало ();
двойка pr1 = * iter1;
unordered_map:: итератор iter2 = umap2.начало ();
двойка pr2 = * iter2;
Cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
Cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
unordered_map umap1 = "банан", "жълт",
"грозде", "зелено", "смокиня", "лилаво", "ягода", "червено";
unordered_map umap2 = "череша", "червено", "лайм", "зелено";
umap1.суап (umap2);
unordered_map:: итератор iter1 = umap1.начало ();
двойка pr1 = * iter1;
unordered_map:: итератор iter2 = umap2.начало ();
двойка pr2 = * iter2;
Cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
Cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

Резултатът е:

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

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

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

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

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

#include
#include
използване на пространство от имена std;
клас TheCla

публично:
int num;
статичен символ;
void func (char cha, const char * str)

Cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

статично празно забавление (char ch)

ако (ch == 'a')
Cout << "Official static member function" << '\n';

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "банан", obj1, "грозде", obj2, "смокиня", obj3, "ягода", obj4, "вар", obj5;
Cout << umap.size() << '\n';
връщане 0;

Резултатът е: 5.

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

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

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

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

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

Заключение

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

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

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

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

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

Chrys

Пристанища с отворен код на търговски игрални машини
Безплатни разширения на играта с отворен код и междуплатформени игри могат да се използват за възпроизвеждане на стари, както и някои от доста скорошн...
Най-добрите игри за команден ред за Linux
Командният ред не е само най-големият ви съюзник при използване на Linux - той може да бъде и източник на забавление, защото можете да го използвате, ...
Най-добрите приложения за картографиране на геймпад за Linux
Ако искате да играете игри на Linux с геймпад вместо типична система за въвеждане на клавиатура и мишка, има някои полезни приложения за вас. Много ко...