Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++: STL multimap.equal_range()

Tags:

c++

stl

multimap

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;
}
like image 556
ashur Avatar asked Sep 19 '12 13:09

ashur


People also ask

What is multimap STL?

Multimaps are part of the C++ STL (Standard Template Library). Multimaps are the associative containers like map that stores sorted key-value pair, but unlike maps which store only unique keys, multimap can have duplicate keys. By default it uses < operator to compare the keys.

What does Equal_range return?

equal_range in C++ std::equal_range is used to find the sub-range within a given range [first, last) that has all the elements equivalent to a given value. It returns the initial and the final bound of such a sub-range.

How do you access elements in multimap?

multimap::find( ) an inbuilt function in C++ STL, which is defined in <map> header file. find() searches elements in the container which are associated with key K. This function returns an iterator pointing to the single element in a container. It returns an iterator if the element found in the container.


2 Answers

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
like image 89
Kerrek SB Avatar answered Oct 09 '22 08:10

Kerrek SB


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

like image 44
Jon Avatar answered Oct 09 '22 09:10

Jon