Барои ҳар калид қиматро дар луғат нигоҳ доред, бо cnt[x]++ шумора кунед, калидро бе илова кардан бинед ва луғатро ҳамчун ҷадвали ҷустуҷӯ истифода баред.
Назария
Дарси 3 аз 4
Хониш: 31 дақиқа
Саволҳо: 8
Маҷмуъ дар ёд дорад, ки кадом қиматҳоро дидааст. Луғат (map) барои ҳар калид чизеро дар ёд дорад: рақами телефон барои ҳар ном, шумора барои ҳар калима, нарх барои ҳар чиз. Ин ҷадвали ҷуфтҳои калид → қимат аст. Ҳар калид як бор меояд ва калидҳо бо тартиб нигоҳ дошта мешаванд.
Барои ҳар калид як қимат
map<K, V> ду навъро ном мебарад: навъи калид ва навъи қимат. m[key] = value калидро илова мекунад ё агар калид аллакай бошад, қимати онро иваз мекунад. m[key] танҳо қиматро мехонад ва m.size() шумораи калидҳост. Коди боло 5577 ва 2-ро чоп мекунад.
Ҳисоб бо луғат
Маъмултарин кори луғат дар ҳал ҳисоб кардан аст: cnt[x]++;. Вақте ки x бори аввал меояд, он ҳоло калид нест. Он гоҳ cnt[x] онро бо қимати 0илова мекунад ва ++ онро ба 1 баробар мекунад. Баъд аз он ҳар cnt[x]++ калидро меёбад ва як илова мекунад. Бубинед, ки калидҳо чӣ тавр меоянд.
Ҳар ҷузъи луғат як ҷуфт аст: p.first калид ва p.second қимати он аст. range-for онҳоро бо тартиби афзоиши калид мегузарад.
Дар сатри якум n ва дар сатри дуюм n калима аст. Чоп кунед, ки чанд калимаи гуногун ҳаст, баъд ҳар калимаи гуногунро бо тартиби алифбо ва шумораи омаданаш.
Вуруд
Баромад
cnt.size() шумораи калимаҳои гуногун аст ва гузариш бо тартиби алифбо ва бе танзими худатон мешавад.
Хондани price["juice"] 0 дод ва "juice"-ро илова кард, то он гоҳ ки erase дар охир онро нест кард. count ва find танҳо менигаранд:
m.count(key) 1 аст, агар калид ҳаст, ва 0, агар нест;
m.find(key) мавқеъи калид аст ё m.end(), агар он набошад. Дар ин ҷо it->first калид ва it->second қимат аст.
[]-ро истифода баред, вақте ки шумо ба ҳар ҳол қиматро менависед (cnt[x]++, m[key] = v). count ё find-ро истифода баред, вақте ки танҳо мепурсед. Онро дар дафтари телефон озмоед ва бубинед, ки ҳар сатр бо он чӣ мекунад.
Дафтари телефонсанҷида бин!
Нест кардани калид ва тирезаи ҳаракаткунанда
m.erase(key) калидро бо қиматаш нест мекунад. Агар калид набошад, чизе рӯй намедиҳад. Ба шумо ин вақте лозим аст, ки шумораҳо на танҳо меафзоянд, балки кам ҳам мешаванд. Ҳолати классикӣ тиреза аст: k қимати паёпай аз як мавқеъ.
Массиви n адад ва дарозии тирезаи k дода шудааст. Барои ҳар тирезаи k қимати паёпай чоп кунед, ки дар он чанд қимати гуногун ҳаст.
Барои тиреза луғати шумораҳоро нигоҳ доред. Вақте ки тиреза як қадам ба рост меравад, як қимат медарояд ва як қимат мебарояд: ду шумора тағйир меёбад, ҳеҷ чиз аз нав ҳисоб намешавад. Ҷавоб cnt.size() аст, вале як нукта ҳаст: калиде, ки шумораи он ба 0 афтодааст, ҳамоно калид аст. Барои ҳамин вақте ки шумора ба сифр мерасад, калидро нест кунед. Инак ҳамаи тирезаҳои дарозии 3.
Тиреза мелағзад: як қимат медарояд, як қимат мебарояд
Луғатро як бор пур кардан ва бо он номҳоро ба ададҳое табдил додан мумкин аст, ки бо онҳо ҳисоб кардан имкон дорад. Рӯзҳои ҳафта:
Дар сатри якум q аст. Дар ҳар як аз q сатри баъдӣ ду рӯз аст: Mon, Tue, Wed, Thu, Fri, Sat ё Sun. Барои ҳар сатр чоп кунед, ки аз рӯзи якум то рӯзи дуюм чанд рӯз пеш аст.
Вуруд
Баромад
day[to] - day[from] метавонад манфӣ бошад, ва дар C++ -3 % 7 ба -3 баробар аст, на ба 4. Агар 7 илова кунем ва боз % 7 гирем, барои ҳар d 0..6 мешавад.
Калид метавонад ҳар навъе бошад, ки < муқоиса карда метавонад: int, long long, char, string ва pair. Ҷуфтҳо аввал аз рӯи first, баъд аз рӯи second муқоиса мешаванд. Ҷуфт вақте калид мешавад, ки як чизро ду адад тасвир мекунад, масалан нуқтаро. Ҳисоб мекунем, ки ҳар нуқта чанд бор меояд:
{x, y} ҷуфтро дар дохили қавсҳо месозад. Гузариш аввал аз рӯи x, баъд аз рӯи y мешавад. cnt.count({x, y}) ва cnt.erase({x, y}) ҳамин тавр кор мекунанд.
Ин чӣ қадар хароҷот дорад
Луғат дарахти мутавозини калидҳост, мисли маҷмуъ. [], count, find ва erase ҳар кадом тақрибан log₂ n қадам мегиранд ва гузаштан n қадам. Вақте ки калидҳо string ҳастанд, ҳар қадам ду сатрро ҳам муқоиса мекунад, барои ҳамин калидҳои дароз каме гаронтар меафтанд.
Калид метавонад адад, сатр ё pair бошад. Ҳар амалиёт тақрибан log₂ n хароҷот дорад.
Дар ин дарс
барои ҳар калид қимат бо map нигоҳ медоред ва бо cnt[x]++ ҳисоб мекунед;
ба калид бе илова кардани он бо count ва find менигаред;
калидро бо erase нест мекунед ва дар тирезаи ҳаракаткунанда ҳисоб мегиред;
луғатро ҳамчун ҷадвали ҷустуҷӯ бо калидҳои ҳар гуна истифода мебаред.
Такрор (2 дақиқа)
Ин барнома чӣ чоп мекунад? set<int> s; s.insert(7); s.insert(2); s.insert(7); for (int x : s) cout << x << " ";
s маҷмуъи {10, 20, 30} аст. *s.lower_bound(25) чӣ мешавад?
Ҷавоб
2 7 : маҷмуъ як 7 нигоҳ медорад ва қиматҳоро бо тартиб мемонад. 2. 30: аввалин қимат, ки 25 ё зиёдтар аст.
Вазъият барои андешаронӣ
Ҳар хонанда ба ҳайвони дӯстдоштаи худ овоз медиҳад, ва ҳайвонҳо калимаанд. Овозҳоро барои ҳар ҳайвон чӣ тавр ҳисоб кунем? Барои вектори ҳисобкунакҳо ба ҳар ҳайвон як адад лозим аст.
Луғат як саф корт аст. Калиди чап қимати рости худро меёбад. Калидҳо бо тартиб ҳастанд.
Оё медонед?
Аввалин луғате, ки калимаҳои англисиро ба забони англисӣ шарҳ медод, A Table Alphabeticall-и Роберт Кодри, соли 1604 бо тақрибан 2 500 «калимаи душвори маъмулии англисӣ» баромад. Ин ҳамон map буд: аз калима ба маъно, аз рӯи калид тартибдода, то хонанда ба саҳифаи лозимӣ фавран гузарад.
Калимаҳои калидӣ
луғат (map)калидқиматҷадвали мутобиқаттиреза
Ман дар ин дарс чӣ омӯхтам?
✓ Ман бо cnt[x]++ ҳар чизро ҳисоб карда метавонам.