Portál AbcLinuxu, 14. května 2025 16:45

Dotaz: kratky dotaz k iteratoru - C++

20.11.2010 20:25 sranda_zitra
kratky dotaz k iteratoru - C++
Přečteno: 352×
Odpovědět | Admin
Dobry vecer a dobrou chut, pokud prave vecerite. Mel bych mensi dotaz k iteratoru od kontejneru vector. Vector ma v sobe pole toho, co zrovna drzi. Pokud bych se chtel k tomuto poli dostat (resp. k ukazateli na 1. prvek tohoto pole), provedu to tak, ze do L-Hodnoty dam promennou typu pointer na typ, ktery zrovna vector drzi a do R-Hodnoty napisu: &*mujVector.begin();

napriklad: short int* p_sh = &*mujVector.begin().
Muzu si tento kus kodu prelozit nasledovne? Hvezdickou rikam "vrat hodnotu" prvniho prvku v poli a ampersand + hvezdickou reknu "vrat adresu prvniho prvku v poli". Je to tak a nebo se mylim?

Predem diky.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.11.2010 21:32 mrk
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je to skoro správne, &*mujVector.begin() vráti pointer na prvý prvok. Len menšia oprava - *mujVector.begin() nie je hodnota, ale referencia. Takže je možné napísať

*mujVector.begin() = 42;

21.11.2010 09:24 sranda_zitra
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Diky, naprosto srozumitelne vysvetleni.
vlastikroot avatar 20.11.2010 21:46 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle by mě nenapadlo, proč to neni normálně int * p = mujVector.begin() ?
We will destroys the Christian's legion ... and the cross, will be inverted
20.11.2010 23:23 jekub
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
tohle je normalne?
21.11.2010 00:06 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Protoze nikde nemate zaruceno, ze iterator musi jit konvertovat na ukazatel na danny typ (pripadne, ze je primo jako ukazatel implementovan).
vlastikroot avatar 21.11.2010 09:50 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Aha, díky. Takže u vectoru to sice funguje, ale je to prasárna.
We will destroys the Christian's legion ... and the cross, will be inverted
22.11.2010 17:14 Jirka P
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Ne tak úplně, funguje to jen na konkrétní implementaci vectoru. Např. na MSVC v Debug módu jsou všechny iterátory objekty, jejichž metody obsahují (kromě předepsané funkčnosti) navíc asserty, takže tam to nefunguje.
22.11.2010 14:54 Sten
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Protože normálně je to:
std::vector<int>::iterator it = mujVector.begin();
Iterátor se chová stejně jako pointer.
22.11.2010 14:51 Sten
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nedoporučuji to používat. Pokud vím, není zaručeno, že pole je souvislé, pouze že přístup k jednomu prvku má konstantní složitost. Místo pointerů používejte přímo iterátory, které se chovají jako stejně jako pointery.
22.11.2010 15:22 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: kratky dotaz k iteratoru - C++

Mylite se, u vektoru je vyslovne receno, ze polozky musi byt usporadany souvisle za sebou.

The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.