ashur
ashur

Reputation: 4317

C++: STL multimap.equal_range()

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;
}

Upvotes: 14

Views: 13935

Answers (4)

Ramanand Yadav
Ramanand Yadav

Reputation: 329

For loop condition will fail only when provided key in equal_range is not available. ->In below scenario it.first will have (2,20) and it.second also will have (2,20). -> in case of mp.equal_range(2)->it.first will have (2,20) and it.second also will have (3,20).

> multimap<int, int> m;
> m.insert({ 2, 20 });
> m.insert({ 3, 20 });
> m.insert({ 4, 20 });
> auto it = mp.equal_range(1);
> for (auto itr = it.first; itr != it.second; ++itr) {   //output
> }
> cout << "Out";

Upvotes: 0

Kerrek SB
Kerrek SB

Reputation: 477100

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

Upvotes: 33

Armen Tsirunyan
Armen Tsirunyan

Reputation: 133014

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.

Upvotes: 4

Jon
Jon

Reputation: 437386

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()).

Upvotes: 14

Related Questions