2009-11-09 13 views
5

J'ai un STL :: multimap et je le recherche avec equal_range pour renvoyer une limite supérieure et inférieure. Puis-je trouver le nombre d'éléments dans cette gamme sans les parcourir tous et les compter un par un?C++ Trouver le nombre d'éléments dans une plage à partir d'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; 
} 

Répondre

18

Utilisez std::distance algorithme pour trouver la distance entre les itérateurs. Comme:

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

Merci pour la réponse rapide! Est-ce que cela me sauverait de la vitesse ou est-ce que cela fait la même chose que ce que je montre ci-dessus? Je montre au bas de cette page: http://www.cplusplus.com/reference/std/iterator/distance/ qu'il pourrait être plus rapide O (1) mais je ne suis pas sûr si c'est un 'aléatoire accéder à l'itérateur 'ou non. – Travis

+1

Non, cela ne vous fera pas gagner du temps. C'est un temps constant pour les itérateurs à accès aléatoire (comme l'itérateur vectoriel). Mais puisque la carte a un itérateur bidirectionnel, la complexité du temps sera linéaire. – Naveen

+0

Ok merci pour votre temps ici. – Travis

1

Si vous voulez juste compter le nombre d'éléments avec une clé donnée, utilisez count:

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

En effet, je pourrais également utiliser cela, mais il semble être la même vitesse que juste itérer moi-même (voir le bas de cette page): http://www.cplusplus.com/reference/stl/multimap/count/ I don ' Je pense qu'il y a un repas gratuit à trouver à ce sujet. – Travis

+2

C'est certainement moins de code à écrire et plus facile à lire que l'itération. Il peut également être plus rapide. Le multimap pourrait être implémenté comme une carte de vecteurs, donc count() trouverait le début, puis chercherait le compte, sans avoir à parcourir la gamme. Bien sûr, cela dépend de l'implémenteur et ne peut pas être invoqué du tout. –