Що означає ітератор-> другий?


157

У C ++, який тип a std::map<>::iterator ?

Ми знаємо, що об’єкт itтипу std::map<A,B>::iteratorмає перевантажений, operator ->який повертає a std::pair<A,B>*, і що std::pair<>має a firstі secondmember.

Але, що відповідають цим двом членам, і чому ми маємо доступ до значення, що зберігається на карті як it->second?


14
std::mapЗберігає ключ і значення . map::iterator.secondвідноситься до значення .
Alok Save

Відповіді:


247

Я впевнений, ви знаєте, що в std::vector<X>магазині зберігається ціла купа Xпредметів, правда? Але якщо у вас є std::map<X, Y>, те, що він насправді зберігає, - це ціла купа std::pair<const X, Y>s. Саме це і є карта - вона з'єднує ключі та пов'язані з ними значення.

Коли ви повторюєте значення a std::map, ви повторюєте всі ці std::pairs. Коли ви відмежуєте один із цих ітераторів, ви отримуєте std::pairключ, що містить ключ, та його пов'язане значення.

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

Тут, якщо ви зробите це *it, ви отримаєте std::pairелемент для першого елемента на карті.

Тепер тип std::pairнадає вам доступ до його елементів через два члени: firstі second. Отже, якщо у вас є std::pair<X, Y>покликаний p, p.firstє Xоб'єктом і p.secondє Yоб'єктом.

Отже, тепер ви знаєте, що перенаправлення std::mapітератора дає вам std::pair, потім ви можете отримати доступ до його елементів за допомогою firstі second. Наприклад, (*it).firstдасть вам ключ і (*it).secondнадасть вам значення. Вони еквівалентні it->firstта it->second.


4
Чому вони просто не використовують [0] і [1] (для "першого" і "другого"), як і все інше в програмуванні?

21
@AdamCross Тому що operator[]повинен повертати тип специфічний , але firstі secondможуть мати різні типи. З іншого боку, std::tupleмає спеціальну функцію помічника std::getдля доступу до її елементів за індексом.
Джозеф Менсфілд

16

Тип елементів елемента std::map(який також є типом виразу, отриманого шляхом перенаправлення ітератора цієї карти), ключем якого є Kі значення V, std::pair<const K, V>- ключ, constщоб запобігти вам втручатися у внутрішнє сортування значень карт.

std::pair<>має два члени на ім'я firstта second(див. тут ), з досить інтуїтивним значенням. Таким чином, давши ітератор iпевній карті, вираз:

i->first

Що еквівалентно:

(*i).first

Посилається на перший ( const) елемент pairоб'єкта, на який вказує ітератор - тобто він посилається на ключ на карті. Натомість вираз:

i->second

Що еквівалентно:

(*i).second

Посилається на другий елемент pair- тобто на відповідне значення на карті.


5
Слова "ключ" та "значення" були б більш інтуїтивними, ніж "перший" та "другий", що передбачає впорядкування.
ahoffer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.