2009-11-09 21 views
5

arasındaki bir aralıktaki öğelerin sayısını bulun Bir STL :: multimap'ım var ve bir üst ve alt sınırı döndürmek için bunu equal_range ile arıyorum. Bu aralıktaki elemanların sayısını, hepsinde yinelemeden ve teker teker saymadan bulabilir miyim?C++ Bir 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; 
} 

cevap

18

Kullanım std::distance algoritması adım adım elde arasındaki mesafeyi bulmak için. Gibi: Sadece belirli bir anahtar ile öğe sayısını saymak istiyorsanız

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

Teşekkür hızlı cevap için! Bu bana herhangi bir hız kazandıracak mı yoksa yukarıda gösterdiğim gibi mi? Bu sayfanın alt kısmında yer alıyorum: http://www.cplusplus.com/reference/std/iterator/distance/ daha hızlı olabilir O (1) fakat bunun bir rastgele olup olmadığından emin değilim yineleyiciye eriş ya da değil. – Travis

+1

Hayır, sizi herhangi bir zaman kurtarmayacaktır. Rasgele erişim yineleyicileri (vektör yineleyici gibi) için sabit bir zamandır. Ancak, haritanın bidirectinal yineleyici olması nedeniyle, doğrusal zaman karmaşıklığı olacaktır. – Naveen

+0

Okuna zaman ayırdığınız için teşekkürler. – Travis

1

, count kullanın:

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

Gerçekten de bunu kullanabilirim ama sadece kendimi tekrarlamakla aynı hızda görünüyor (bu sayfanın alt kısmına bakın): http://www.cplusplus.com/reference/stl/multimap/count/ Bu konuda herhangi bir ücretsiz öğle yemeği olduğunu düşünmeyin. – Travis

+2

Yazmak ve tekrarlamaktan daha kolay okunması daha az kod. Ayrıca daha hızlı olabilir. Multimap, bir vektörler haritası gibi bir şey olarak uygulanabilir, bu yüzden count(), başlangıcı bulabilir, daha sonra, aralığı aşmak zorunda kalmadan sayımı arar. Elbette, bu uygulayıcıya bağlı ve hiçbir şekilde güvenilmez. –

İlgili konular