2013-03-16 14 views
104

C++ 'da, std::map<>::iterator'un türü nedir?İteratör -> ikinci ne anlama geliyor?

Biz tip std::map<A,B>::iterator bir nesne it bir std::pair<A,B>* döndüren bir aşırı operator -> sahip olduğunu biliyoruz ve std::pair<> bir first ve second üyesinin olduğunu.

Ancak, bu iki üye neye karşılık geliyor ve neden haritada saklanan değere it->second olarak erişmek zorundayız?

+10

A 'std :: map' bir * anahtarı * ve bir * değeri * .'map :: iterator.second' depolar * değer *. –

+0

@AlokSave: Teşekkürler. Yorumunuz, iki cevabı okumaktan çok okuyucuları kurtardı, ki bu da bir tweetin uzunluğuna büzülmüş olabilirdi. – displayName

cevap

163

std::vector<X>, X nesnesinin bir demetini depoladığını biliyorsunuzdur, değil mi? Ancak, bir std::map<X, Y> varsa, aslında depoladığı şey, bir grup std::pair<const X, Y> s'dir. Tam olarak bir harita budur - anahtarları ve ilişkili değerleri bir araya getirir.

std::map üzerinde yinelediğinizde, tüm bu std::pair s üzerinde yineleme yapıyorsunuz. Bu yineleyicilerden birini kullandığınızda, anahtarı ve ilişkili değerini içeren bir std::pair alırsınız. Şimdi *it yaparsanız Burada

std::map<std::string, int> m = /* fill it */; 
auto it = m.begin(); 

, haritanın ilk element için std::pair alacak.

Artık std::pair tipi, öğelerine iki üyeden erişmenizi sağlar: first ve second. Yani, p adı verilen std::pair<X, Y>, p.firstX nesnesi ve p.second nesnesinin Y nesnesidir.

Şimdi de std::map yineleyici dereferencing size std::pair sağladığını biliyor, sen first ve second ile unsurlarını sonra erişebilir. Örneğin, (*it).first size anahtarı verecektir ve (*it).second size değeri verecektir. Bunlar, it->first ve it->second ile eşdeğerdir.

+2

Neden programlamada diğer her şey gibi [0] ve [1] ("ilk" ve "saniye" için) kullanmıyorlar? –

+13

@AdamCross Çünkü operatör [] belirli bir tür döndürmek zorundadır, ancak 'ilk' ve 'ikinci' farklı türlere sahip olabilir. Öte yandan 'std :: tuple', indeksine göre elemanlarına erişmek için özel bir yardım fonksiyonuna sahiptir. –

+1

Cevapladığınız için teşekkür ederiz. Bu şimdi mantıklı. –

13

anahtar K ve değer Vstd::pair<const K, V> (aynı zamanda bu haritanın bir yineleyici kaldırma tarafından elde edilen bir ekspresyon türü) bir std::map elemanlarının türü - kilit müdahale önlemek için const olan içsel harita değerleri sınıflandırmasıyla.

std::pair<> oldukça sezgisel anlamı olan first ve second adında iki üye (here bakınız) vardır. Bu nedenle, belirli bir haritaya bir yineleyici i verilen sentezleme:

i->first 

eşdeğerdir:

(*i).first 

pair nesnenin ilk (const) elemanı ifade eder ile gösterilen yineleyici - yani haritadaki anahtarını gösterir. Bunun yerine, sentezleme:

i->second 

eşdeğerdir: - diğer bir deyişle haritasında karşılık gelen değeri için

(*i).second 

pair arasında ikinci elemanı ifade eder.