Reputation: 4317
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
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
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
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
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