C ++: STL multimap.equal_range ()

У меня есть этот код, и я не могу понять часть, где equal_range метод возвращает итераторы.
Я знаю, что диапазон пара объект с двумя объектами мультикарты внутри, но то, что я не понимаю, поэтому есть 'for (it = range.first; it != range.second; ++it)' — Что это значит именно?

// multmap.cpp -- use a multimap
#include <iostream>
#include <string>
#include <map>
#include <algorithm>

typedef int KeyType;
typedef std::pair<const KeyType, std::string> Pair;
typedef std::multimap<KeyType, std::string> MapCode;

int main()
{
using namespace std;
MapCode codes;
codes.insert(Pair(415, "San Francisco"));
codes.insert(Pair(510, "Oakland"));
codes.insert(Pair(718, "Brooklyn"));
codes.insert(Pair(718, "Staten Island"));
codes.insert(Pair(415, "San Rafael"));
codes.insert(Pair(510, "Berkeley"));

cout << "Number of cities with area code 415: "<< codes.count(415) << endl;
cout << "Number of cities with area code 718: "<< codes.count(718) << endl;
cout << "Number of cities with area code 510: "<< codes.count(510) << endl;
cout << "Area Code City\n";

MapCode::iterator it;
for (it = codes.begin(); it != codes.end(); ++it)
cout << " " << (*it).first << " "<< (*it).second << endl;

pair<MapCode::iterator, MapCode::iterator> range
= codes.equal_range(718);

cout << "Cities with area code 718:\n";
for (it = range.first; it != range.second; ++it) //<------------------ here
cout << (*it).second << endl;
return 0;
}

8

Решение

Итераторы в паре определяют диапазон элементов с ключами, равными тому, что вы искали в манере [range.first, range.second),

Это означает, что для перебора этого диапазона вы начинаете с range.first и продвигать итератор, пока он не достигнет range.secondЭто означает, что вы только что вышли из равного диапазона. Концептуально это то же самое, что происходит, когда вы перебираете диапазон [container.begin(), container.end()),

11

Другие решения

Результат equal_rangeа именно ваш range объект, является пара двух итераторов [beginning-of-range, end-of-range), Итак, вы хотите перебрать [range.first, range.second):

auto range = m.equal_range(4);

+---+---+---+---+---+---+---+---+---+
| 2 | 3 | 3 | 4 | 4 | 4 | 4 | 5 | 6 |    =:   m
+---+---+---+---+---+---+---+---+---+
^               ^
|               |
range.first    range.second
25

equal_range возвращает пару итераторов i1, i2 так, что все элементы в пределах диапазона [i1, i2) есть тот же ключ. Следовательно, чтобы перебрать все города с кодом 718, вы звоните equal_rangeи затем итерации от возвращенной пары first к возвращенной паре second,

4
По вопросам рекламы [email protected]