2012-09-19 15 views
7

Tengo este código y no puedo entender la parte donde equal_range método devuelve los iteradores. Sé que el rango es par objeto con dos objetos multimapa adentro, pero lo que no entiendo, es por qué hay 'for (it = range.first; it != range.second; ++it)' - ¿Qué significa esto exactamente?C++: STL multimap.equal_range()

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

Respuesta

11

Los iteradores en el par definen la gama de artículos con claves iguales a lo que ha buscado la manera [range.first, range.second).

Esto significa que para iterar sobre ese rango, comienza desde range.first y avanza el iterador hasta que alcanza range.second, lo que significa que acaba de salir del mismo rango. Conceptualmente, es lo mismo que sucede cuando iteras sobre un rango [container.begin(), container.end()).

+0

creo que su respuesta es el más comprensible para mí, porque fue complicado para ver la iteración a través de par objetos miembros. Pero si es * igual * que '[container.begin(), container.end())' eso está bien. Gracias – ashur

4

equal_range devuelve un par de iteradores i1, i2 de modo que todos los elementos dentro del rango [i1, i2) tengan la misma clave. Por lo tanto, para iterar a través de todas las ciudades con el código 718, llame al equal_range, y luego itere desde el first del par devuelto al second del par devuelto.

+0

Corto y dulce – ammassalik

24

El resultado de equal_range, a saber, su objeto range, es un par de dos iteradores [beginning-of-range, end-of-range). Por lo que desea iterar sobre [range.first, range.second):

auto range = m.equal_range(4); 

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