2013-02-15 23 views
5

Bir çiftin vektörünün yineleyicisinde çiftin değerlerine erişirken neden aşağıdaki hatayı alıyorum?Çiftleri Vektöründen Değer Alma Hatası

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

Hata mesajı:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

Bunu nasıl düzeltebilirim?

+1

Operatör önceliğini, '*' ve '.' önceliklerini okumak isteyebilirsiniz: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

cevap

7

Bu, işaretçiler için de geçerli olan bir sorundur (yineleyici bir işaretçi gibi davranır). için değerli noktaları işaretçi (veya yineleyici) bir üyeyi erişmek için iki yol vardır:

it->first  // preferred syntax: access member of the pointed-to object 

veya

(*it).first // verbose syntax: dereference the pointer, access member on it 

operatör öncelik

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

içine ifadesini döndüğü first adında bir üyeye sahip olmadığından başarısız olan yineleyici üzerinde first üyesine erişmeye çalışır. Eğer olduysa, o üyenin değerini iptal edersiniz.


Ancak, çoğu bu tür durumlarda size değerlere anahtarından eşlemek için std::map kullanmalıdır. Yerine vector<pair<int,string> > arasında, benzer (ekleme, yineleme ve malzeme de çiftleri ile olur) davranır map<int,string> kullanmak gerekir, ancak daha hızlı rastgele erişim için veri yapısında anahtarları sıralar:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

Not temel bir fark arasındaki Bir harita ve çiftlerden oluşan bir vektör, bir haritanın elemanları, anahtarlarına göre sıralayarak yeniden düzenlemesidir. Ekleme sırası daha sonra sorgulanamaz. Bunu yapmak istemediğiniz durumlar vardır (ekleme siparişi söz konusu olduğunda), bu gibi durumlarda ya çözümünüz ya da en azından anahtar ve değer içeren özel tipleri olan bir vektör doğru çözümdür.

+0

2. varyantın olması gerektiğini düşünüyorum * (* it) .first' –

+0

@ g-makulik Elbette, teşekkürler. – leemes

+0

Evet, 2. seçenek doğru! Teşekkürler. Harikasın! –