Ц ++

Јединствени и уређени контејнери на Ц ++

Јединствени и уређени контејнери на Ц ++
6, 10, 2, 8, 4 је скуп; 2, 4, 6, 8, 10 је скуп истих целих бројева распоређених у растућем редоследу. У математици, скуп има јединствене елементе (различите елементе), односно, ниједан елемент се не појављује више пута. Поред тога, мултисет је скуп, где се било који елемент може појавити више пута. 6, 6, 10, 2, 2, 8, 4, 4, 4 је мултисет. 2, 2, 4, 4, 4, 6, 6, 8, 10 је исти мултисет, али са елементима распоређеним у растућем редоследу. Овај чланак се не бави мултисетом. Бави се Ц ++ структуром података која се зове сет.

Мапа у софтверу је попут низа, али то је низ са два ступца уместо једним. Прва колона има кључеве, а друга колона вредности. Сваки ред је један пар, чинећи пар кључ / вредност. Кључ је директно повезан са његовом вредношћу.

Пример мапе је 'ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10. Први пар кључ / вредност овде уметнут је 'ц', 3, где је 'ц' кључ, а 30 вредност. Ова карта није поредана кључевима. Поредак ове карте по кључевима даје 'а', 10, 'б', 20, 'ц', 30, 'д', 30, 'е', 40. Приметите да могу бити дуплиране вредности, али не и дуплирани кључеви. Уређена карта је карта поредана по кључевима.

Мултисет је скупу, као и мултимапа мапи. То значи да постоје мапе са дупликатима кључева. Пример мултимапе је 'а', 10, 'б', 20, 'б', 20, 'ц', 30, 'ц', 30, 'д ', 30, ' е ', 40. И као што је горе речено, овај чланак се не бави мултимапирањем, већ се бави Ц ++ структуром података која се назива мап.

У Ц ++, структура података је структура са својствима (чланови података) и методама (функције члана). Подаци структуре су списак; сет је листа; мапа је листа парова кључ / вредност.

Овај чланак говори о основама скупова и мапа на Ц ++-у, а да би читалац боље разумео овај чланак, требало је да има основно знање о Ц-у++.

Садржај чланка:

Класа и њени објекти:

У Ц ++-у скуп, мапа и друге сличне структуре називају се контејнери. Класа је генерализована јединица са члановима података, који су променљиве, и функцијама чланова које су повезане. Када се члановима података дају вредности, формира се објекат. Међутим, објекат се формира у процесу који се назива инстанцијација. Како класа може довести до различитих вредности за исте променљиве члана података, различити објекти се тада могу инстанцирати из исте класе.

У језику Ц ++ неупотребљив скуп је класа, као и неупотребљива мапа. Када се објект инстанцира из неупотребљивог скупа или неупотребљиве мапе, објекат постаје стварна структура података. Са структурама података скупа и мапе, главни члан података је листа. Па, скуп и мапа чине групу контејнера који се називају уређени асоцијативни контејнери. Неуређени скуп и неуређена мапа такође постоје, али нажалост у овом чланку се о њима не говори.

Креирање скупа или мапе:

Инстанцирање скупа из његове класе сетова ствара скуп; инстанцирање мапе из њене класе мапе ствара мапу. Тако креирани објекат добија име по избору програмера.

Да би креирао сет, програм треба да започне са:

#инцлуде
#инцлуде
коришћење простора имена стд;

Обратите пажњу на директиву „#инцлуде ”, Која укључује библиотеку скупова која има класу скупова из које ће се инстанцирати скупове података.

Да би креирао мапу, програм треба да започне са:

#инцлуде
#инцлуде
коришћење простора имена стд;

Обратите пажњу на директиву „#инцлуде ”, Која укључује библиотеку мапа која има класу мапе из које ће се инстанцирати структуре података мапе.

Синтакса за стварање празног скупа је:

комплет објецтНаме

Пример:

комплет сетОбј;

Пример креирања скупа са садржајем је:

комплет сетОбј (6, 10, 2, 8, 4);

Синтакса за стварање празне мапе је:

Мапа објецтНаме

Пример:

Мапа мапОбј;

Пример за стварање мапе са садржајем је:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);

Основе итератора:

Итератор је разрађени показивач који се може користити за прелазак листе структуре података од почетка до краја.

Функција члана бегин ()

Функција члана бегин () враћа итератор који показује на први елемент листе. Следећи пример то илуструје за скуп:

комплет сетОбј (6, 10, 2, 8, 4);
комплет:: итератор итер = сетОбј.почети();
цоут << *iter << '\n';

Обратите пажњу на начин на који се користи бегин () са сетОбј и оператором тачака. итер је враћени објект итератора. Такође, имајте на уму начин на који је проглашен. * је индиректни оператор. Као што се користи са итер, враћа први елемент скупа; први елемент је 2 уместо 6 - погледајте објашњење у наставку.

Следећи пример илуструје употребу функције бегин () за мапу:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
Мапа:: итератор итер = мапОбј.почети();
цоут << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите пажњу на начин на који се користи бегин () са мапОбј и тачком оператором. итер је враћени објект итератора. Такође, имајте на уму начин на који је проглашен. „Прво“, како се овде користи, односи се на кључ. „Други“ се односи на вредност која одговара кључу. Уочите како су коришћени са итер за добијање компонената почетног елемента листе. Први елемент је а, 10 уместо ц, 30 - погледајте објашњење у наставку.

Функција члана „бегин () цонст“

Функција члана „бегин () цонст“ враћа итератор који показује на први елемент листе када декларација скупа започиње цонст (за константу). Под овим условом, итератор не може променити вредност на листи на коју се позива враћени итератор. Следећи пример илуструје његову употребу за скуп:

цонст сет сетОбј (6, 10, 2, 8, 4);
комплет:: цонст_итератор итер = сетОбј.почети();
цоут << *iter << '\n';

Обратите пажњу на начин на који се користи бегин () са сетОбј и тачком оператором. Ниједна „цонст“ није откуцана одмах након старт (). Међутим, „цонст“ је претходио декларацији. овде је враћени објекат константног итератора, који се разликује од нормалног итератора. Такође, имајте на уму начин на који је проглашен. * је индиректни оператор; као што се користи са итер, враћа први елемент скупа. Први елемент је 2 уместо 6 - погледајте објашњење у наставку.

Следећи пример илуструје употребу функције „бегин () цонст“ за мапу:

цонст мап мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
Мапа:: цонст_итератор итер = мапОбј.почети();
цоут << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите пажњу на начин на који се користи бегин () са мапОбј и тачком оператором. Ниједна „цонст“ није откуцана одмах након старт (). Међутим, „цонст“ је претходио декларацији. овде је враћени објекат константног итератора, који се разликује од нормалног итератора. Такође, имајте на уму начин на који је проглашен. „Прво“, како се овде користи, односи се на кључ; „Други“, како се овде користи, односи се на вредност која одговара кључу. Уочите како су коришћени са итер-ом за добијање компонената почетног елемента листе. Први елемент је а, 10 уместо ц, 30 - погледајте објашњење у наставку.

Крајњи () члан Функција

Функција члана енд () враћа итератор који показује одмах након краја листе. Следећи пример то илуструје за скуп:

комплет сетОбј (6, 10, 2, 8, 4);
комплет:: итератор итер = сетОбј.крај();
цоут << *iter << '\n';

Обратите пажњу на начин на који се енд () користи са сетОбј и тачком оператором. итер је враћени објект итератора. Такође, имајте на уму начин на који је проглашен. * је индиректни оператор; као што се користи са итер, враћа последњи + 1 елемент скупа. У ауторском рачунару, овај последњи + 1 елемент је 5, што није на листи. Дакле, пазите да не користите овај елемент.

Следећи пример илуструје употребу функције енд () за мапу:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
Мапа:: итератор итер = мапОбј.крај();
цоут << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите пажњу на начин на који се енд () користи са мапОбј и тачком оператором. итер је враћени објект итератора. Такође, имајте на уму начин на који је проглашен. * је индиректни оператор; као што се користи са итер, враћа последњи + 1 елемент мапе. На рачунару аутора, овај последњи +1 елемент је , 0, што није на листи. Дакле, пазите да не користите овај елемент.

Функција члана „енд () цонст“

Функција члана „енд () цонст“ враћа итератор који показује непосредно након краја листе када декларација скупа започиње цонст (за константу). Под овим условом, итератор не може променити вредност на листи на коју се позива враћени итератор. Следећи пример илуструје његову употребу за скуп:

цонст сет сетОбј (6, 10, 2, 8, 4);
комплет:: цонст_итератор итер = сетОбј.крај();
цоут << *iter << '\n';

Обратите пажњу на начин на који се енд () користи са сетОбј и тачком оператором. Ниједна „цонст“ није откуцана непосредно након краја (). Међутим, „цонст“ је претходио декларацији. итер је враћени објект итератора. Такође, имајте на уму начин на који је проглашен. * је индиректни оператор; као што се користи са итер, враћа последњи + 1 елемент скупа.

Следећи пример илуструје употребу функције „енд () цонст“ за мапу:

цонст мап мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
Мапа:: цонст_итератор итер = мапОбј.крај();
цоут << "" << (*iter).first <<',' << (*iter).second << "\n";

Обратите пажњу на начин на који се енд () користи са мапОбј и тачком оператором. Ниједна „цонст“ није откуцана непосредно након краја (). Међутим, „цонст“ је претходио декларацији. итер је враћени константни итератор објект, који се разликује од нормалног итератора. Такође, пажљиво посматрајте начин на који је проглашен.

Приступ елементима за сет и мапу:

Комплет

Са сетом, елемент се чита помоћу индиректног оператора. Прва два елемента скупа читају се у следећем примеру:

комплет сетОбј (6, 10, 2, 8, 4);
комплет:: итератор итер = сетОбј.почети();
цоут << *iter << '\n';
++итер;
цоут << *iter << '\n';

Излаз је 2, а затим следи 4 - погледајте објашњење у наставку. Да би се усмерило на следећи елемент листе, итератор се повећава.

Напомена: Елемент није могуће променити помоћу индиректног оператора за скуп. На пример, „* итер = 9;“ није могуће.

Мапа

Мапа се састоји од парова кључ / вредност. Вредност се може прочитати помоћу одговарајућег кључа и променити помоћу истог кључа. Следећи сегмент кода то илуструје:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
цоут << mapObj['b'] << '\n';
мапОбј ['б'] = 55;
цоут << mapObj['b'] << '\n';

Излаз је:

20
55

Оператор тачке овде није коришћен. Уместо тога, коришћен је оператор угластих заграда који узима кључ као садржај.

Редослед елемената у скупу или на мапи:

Елементи се могу уметнути у сет, било којим редоследом. Међутим, једном уметнути, сет преуређује своје елементе у растућем редоследу. Узлазни поредак је подразумевани налог. Ако је потребан опадајући редослед, тада скуп мора бити декларисан као у следећем примеру:

комплет > сетОбј (6, 10, 2, 8, 4);

Дакле, после типа, нпр.г., инт, за шаблон постоји зарез, а иза њега слиједи „већи”У угаоне заграде.

Елементи се могу уметати у мапу било којим редоследом. Међутим, једном убачена, карта преуређује своје елементе у растућем редоследу по кључу (само), задржавајући везу између сваког кључа и његове вредности. Узлазни поредак је подразумевани налог; ако је потребан силазни редослед, онда се карта мора декларисати као у следећем примеру:

Мапа > мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);

Дакле, након парова типова, нпр.г., „Цхар, инт“, за шаблон стоји зарез, а затим „већи”У угаоне заграде.

Прелазак скупа

Док-петља или фор-петља са итератором могу се користити за прелазак скупа. Следећи пример користи фор-лооп за прелазак скупа који је конфигурисан у опадајућем редоследу:

комплет > сетОбј (6, 10, 2, 8, 4);
за (сет:: итератор итер = сетОбј.почети(); итер != сетОбј.крај(); ++ итер)

цоут << *iter << ";

Излаз је:

10 8 6 4 2

Повећањем итератора усмерава се на следећи елемент.

Прелазак мапе

Док-петља или фор-петља са итератором могу се користити за прелазак мапе. Следећи пример користи фор-лооп за прелазак мапе која је конфигурисана у опадајућем редоследу:

Мапа > мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
за (мапу:: итератор итер = мапОбј.почети(); итер != мапОбј.крај(); ++ итер)

цоут << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Излаз је:

е, 40, д, 30, ц, 30, б, 20, а, 10,

Повећањем итератора усмерава се на следећи елемент. „Прво“ се у коду односи на кључ, а „друго“ односи се на одговарајућу вредност. Обратите пажњу како су ове вредности добијене за излаз.

Остале уобичајене функције чланова:

Функција величине ()

Ова функција враћа цео број, што је број елемената на листи. Поставите пример:

комплет > сетОбј (6, 10, 2, 8, 4);
цоут << setObj.size() << '\n';

Излаз је 5.

Пример мапе:

Мапа > мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
цоут << mapObj.size() << '\n';

Излаз је 5.

Функција инсерт ()

комплет

сет не дозвољава дуплицирање. Дакле, сваки уметнути дупликат се тихо одбацује. Са сетом, аргумент функције инсерт () је вредност коју треба уметнути. Вредност се уклапа у положај у којем редослед у скупу остаје растући или силазни. Пример:

комплет сетОбј (6, 10, 2, 8, 4);
сетОбј.уметак (6);
сетОбј.уметак (9);
сетОбј.уметак (12);
за (сет:: итератор итер = сетОбј.почети(); итер != сетОбј.крај(); ++ итер)

цоут << *iter << ";

Излаз је:

2 4 6 8 9 10 12

Напомена: Функција члана инсерт () може се користити за попуњавање празног скупа.

Мапа

мапа не дозвољава дуплицирање по кључу. Дакле, сваки уметнути дупликат се тихо одбацује. Код мапе, аргумент функције инсерт () је пар кључ / вредност у заградама. Елемент се поставља кључем у положај у којем редослед на мапи остаје узлазан или силазан. Пример:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
мапОбј.инсерт ('е', 80);
мапОбј.инсерт ('ф', 50);
мапОбј.инсерт ('г', 60);
за (мапу:: итератор итер = мапОбј.почети(); итер != мапОбј.крај(); ++ итер)
цоут << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Излаз је:

а, 10, б, 20, ц, 30, д, 30, е, 40, ф, 50, г, 60,

Напомена: Функција члана инсерт () може се користити за попуњавање празне мапе.

Функција емпти ()

Ова функција враћа труе ако је листа празна и фалсе ако је другачије. Поставите пример:

комплет сетОбј (6, 10, 2, 8, 4);
боол рет = сетОбј.празно ();
цоут << ret << '\n';

Излаз је 0 за фалсе, што значи да скуп овде није празан.

Пример мапе:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
боол рет = мапОбј.празно ();
цоут << ret << '\n';

Излаз је 0 за фалсе, што значи да карта овде није празна.

Функција брисања ()

комплет

Размотрите следећи сегмент кода:

комплет сетОбј (10, 20, 30, 40, 50);
комплет:: итератор итер = сетОбј.почети();
комплет:: итератор итр = сетОбј.обрисати (итер);
цоут << "new size: " << setObj.size() << '\n';
цоут << "next value: " << *itr << '\n';
итр = сетОбј.избрисати (итр);
цоут << "new size: " << setObj.size() << '\n';
цоут << "next value: " << *itr << '\n';

Излаз је:

нова величина: 4
следећа вредност: 20
нова величина: 3
следећа вредност: 30

Функција ерасе () узима итератор који указује на елемент као аргумент. Након брисања елемента, функција ерасе () враћа итератор који показује на следећи елемент.

Мапа

Размотрите следећи сегмент кода:

Мапа мапОбј ('а', 10, 'б', 20, 'ц', 30, 'д', 40, 'е', 50);
Мапа:: итератор итер = мапОбј.почети();
Мапа:: итератор итр = мапОбј.обрисати (итер);
цоут << "new size: " << mapObj.size() << '\n';
цоут << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
итр = мапОбј.избрисати (итр);
цоут << "new size: " << mapObj.size() << '\n';
цоут << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Излаз је:

нова величина: 4
следећи пар вредности: б, 20
нова величина: 3
следећи пар вредности: ц, 30

Функција ерасе () узима итератор који указује на елемент као аргумент. Након брисања елемента, функција ерасе () враћа итератор који показује на следећи елемент.

Функција цлеар ()

Функција цлеар () уклања све елементе са листе. Поставите пример:

комплет сетОбј (6, 10, 2, 8, 4);
сетОбј.јасно();
цоут << setObj.size() << '\n';

Излаз је 0.

пример мапе:

Мапа мапОбј ('ц', 30, 'б', 20, 'д', 30, 'е', 40, 'а', 10);
мапОбј.јасно();
цоут << mapObj.size() << '\n';

Излаз је 0.

Закључак:

Постављена структура података у Ц ++ је структура у којој се листа елемената по дефаулту чува у растућем редоследу или у опадајућем редоследу по избору програмера. Сви елементи сета су јединствени. Структура података мапе у Ц ++ је структура у којој је листа хеш парова кључ / вредност, која се подразумевано чува у растућем редоследу кључева или у падајућем редоследу по избору програмера. Кључеви су такође јединствени и могу бити дуплиране вредности. Главни члан података било које од структура је листа. Било која структура има функције члана, од којих се неке обично користе.

Вулкан за кориснике Линука
Са сваком новом генерацијом графичких картица видимо да програмери игара помичу границе графичке верности и долазе на корак од фотореализма. Али упрко...
ОпенТТД вс Симутранс
Стварање сопствене симулације превоза може бити забавно, опуштајуће и изузетно примамљиво. Због тога морате да испробате што више игара како бисте про...
Водич за ОпенТТД
ОпенТТД је једна од најпопуларнијих игара за пословну симулацију. У овој игри морате створити диван посао превоза. Међутим, почет ћете у почетку око 1...