2009-11-09 8 views
5

Ho un STL :: multimap e lo cerco con equal_range per restituire un limite superiore e inferiore. Posso trovare il numero di elementi in questo intervallo senza scorrere tutti e contarli uno per uno?C++ Trova il numero di elementi in un intervallo da un STL :: multimap

#include <iostream> 
#include <map> 

using namespace std; 

int main() { 
    multimap<int,int> mm; 
    pair<multimap<int, int>::iterator,multimap<int, int>::iterator> ret; 
    multimap<int,int>::iterator retit; 

    for (int n=0; n<100; n++) { 
     mm.insert (make_pair(rand()%10,rand()%1000)); 
    } 

    ret = mm.equal_range(5); 

    int ct = 0; 
    for (retit=ret.first; retit!=ret.second; ++retit) { 
     cout << retit->second << endl; 
      ct++; 
    } 
    cout << ct << endl; 

    return 0; 
} 

risposta

18

Usa std::distance algoritmo per trovare la distanza tra i iteratori. Come:

int ct1 = std::distance(ret.first, ret.second); 
+0

Grazie per la rapida risposta! Questo mi farà risparmiare velocità o fa lo stesso che sto mostrando sopra? Sto mostrando in fondo a questa pagina: http://www.cplusplus.com/reference/std/iterator/distance/ che potrebbe essere più veloce O (1) ma non sono sicuro se questo è un 'casuale accesso iteratore 'o no. – Travis

+1

No, non ti salverà in qualsiasi momento. È un tempo costante per gli iteratori di accesso casuale (come iteratore vettoriale). Ma dal momento che la mappa ha un iteratore bidirezionale, avrà una complessità temporale lineare. – Naveen

+0

Ok grazie per il tuo tempo qui. – Travis

1

Se si desidera solo per contare il numero di elementi con una data chiave, utilizzare count:

int ct = mm.count(5); 
+1

In effetti potrei anche usarlo ma sembra essere la stessa velocità di solo iterarlo da solo (vedi la parte inferiore di questa pagina): http://www.cplusplus.com/reference/stl/multimap/count/ I don ' Penso che ci sia del pranzo gratis su questo. – Travis

+2

È sicuramente meno codice da scrivere e più facile da leggere rispetto all'iterazione. Potrebbe anche essere più veloce. Il multimap potrebbe essere implementato come qualcosa di simile a una mappa di vettori, quindi count() troverà l'inizio, quindi controlla il conteggio, senza dover iterare nell'intervallo. Naturalmente, questo dipende dall'implementatore e non può essere invocato affatto. –

Problemi correlati