14

I've got this code and I cannot understand part where equal_range method returns iterators. I know range is pair object with two multimap objects inside, but what I don't get, is why there is 'for (it = range.first; it != range.second; ++it)' - What does this mean exactly ?

// 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;
}
ashur
  • 4,177
  • 14
  • 53
  • 85

3 Answers3

32

The result of equal_range, namely your range object, is a pair of two iterators [beginning-of-range, end-of-range). So you want to iterate over [range.first, range.second):

auto range = m.equal_range(4);

+---+---+---+---+---+---+---+---+---+
| 2 | 3 | 3 | 4 | 4 | 4 | 4 | 5 | 6 |    =:   m
+---+---+---+---+---+---+---+---+---+
            ^               ^
            |               |
       range.first    range.second
Kerrek SB
  • 464,522
  • 92
  • 875
  • 1,084
14

The iterators in the pair define the range of items with keys equal to what you searched for in the manner [range.first, range.second).

This means that to iterate over that range, you start from range.first and advance the iterator until it reaches range.second, which means that you have just stepped off the equal range. Conceptually it's the same as what happens when you iterate over a range [container.begin(), container.end()).

Jon
  • 428,835
  • 81
  • 738
  • 806
  • I think your answer is the most understandable for me, because It was confusing to see iterating over pair objects members. But if it's *same* as `[container.begin(), container.end())` that's ok. Thanks – ashur Sep 19 '12 at 13:14
4

equal_range returns a pair of iterators i1, i2 such that all elements within the range [i1, i2) have the same key. Hence, in order to iterate through all cities with code 718, you call equal_range, and then iterate from the returned pair's first to the returned pair's second.

Armen Tsirunyan
  • 130,161
  • 59
  • 324
  • 434