İterator-> second ne anlama geliyor?


157

C ++ 'da a türü std::map<>::iteratornedir?

Biz bir nesne biliyoruz itÇeşidi std::map<A,B>::iteratoraşırı yüklenmiş olan operator ->bir döndüren std::pair<A,B>*ve bu std::pair<>bir sahiptir firstve secondüyesi.

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


14
A std::map, bir anahtar ve bir değer saklar . değerimap::iterator.second ifade eder .
Alok Save

Yanıtlar:


247

Eminim ki bir std::vector<X>mağaza bir sürü Xnesne saklar , değil mi? Ama varsa std::map<X, Y>, aslında depoladığı şey bir sürü std::pair<const X, Y>s. Bir harita tam olarak budur - anahtarları ve ilişkili değerleri birleştirir.

Bir üzerinden std::mapyinelediğinizde, tüm bunları yinelersiniz std::pair. Bu yineleyicilerden birini iptal ettiğinizde std::pair, anahtarı ve ilişkili değerini içeren bir anahtar alırsınız .

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

Burada, şimdi yaparsanız *it, std::pairharitadaki ilk öğe için.

Artık tür std::pair, öğelerine iki üye aracılığıyla erişmenizi sağlar: firstve second. Eğer bir varsa Yani std::pair<X, Y>denilen p, p.firstbir olan Xnesne ve p.secondbir olduğunu Ynesne.

Artık bir std::mapyineleyicinin silme işleminin size bir verdiğini std::pairbiliyorsunuz, ardından öğelerine firstve ile erişebilirsiniz second. Örneğin, (*it).firstsize anahtarı (*it).secondverecek ve size değeri verecektir. Bunlar ile eşdeğerdir it->firstve it->second.


4
Neden sadece [0] ve [1] 'i ("birinci" ve "ikinci" için) programlamadaki diğer her şey gibi kullanmıyorlar?

21
Çünkü @AdamCross operator[]belirli türde dönmek var ama firstve secondfarklı türde olabilir. Öte yandan, öğelerine indeksle erişmek için std::tupleözel bir yardımcı işlevi vardır std::get.
Joseph Mansfield

16

Bir elemanlarının türü std::mapanahtar (aynı zamanda bu haritanın bir yineleyici kaldırma tarafından elde edilen bir ekspresyon türü) Kve değer Volan std::pair<const K, V>anahtar - constharita değerlerinin iç sıralama ile müdahale engellemek için.

std::pair<>oldukça sezgisel bir anlamı olan iki üyeye sahiptir firstve burayasecond bakınız . Böylece, belirli bir haritaya bir yineleyici verildiğinde , ifade:i

i->first

Şuna eşittir:

(*i).first

Belirtir ilk ( constbir) parçanın pairyineleyici ile gösterilen nesne - başka bir deyişle karşılık gelir anahtar haritası. Bunun yerine, ifade:

i->second

Şuna eşittir:

(*i).second

İfade eder , ikinci elemanın pairkarşılık gelen, yani - değeri harita.


5
"Anahtar" ve "değer" kelimeleri, "birinci" ve "ikinci" ifadelerinden daha sezgisel olurdu, bu da sipariş anlamına gelir.
ahoffer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.