Divný cyklus – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Divný cyklus – C / C++ – Fórum – Programujte.comDivný cyklus – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Sefiros0
Návštěvník
3. 7. 2013   #1
-
0
-

Hoj,

tentokrát nemám žádný problém ale pouze otázku. Našel jsem v jednom ukázkovém kódu podivný cyklus for který svou funkčností připomíná cyklus foreach z jiných jazyků. Funguje tak jak bych očekával, umí projít krásně celé pole ale opravdu nechápu jak to že funguje i u kontejneru list. Nedokáži si představit jak přistupuje vnitřně k prvkům aniž by se nestal závislým na konkrétní sadě kontejnerů (u pole má pointer což mají všechna pole ale u kontejneru má iterátor který musí získat členskou funkcí, která není nikde pevně daná). Na stránce cplusplus.com jsem v dokumentaci tento typ cyklusu ani nenašel (http://www.cplusplus.com/…ial/control/). Budu vděčný za bližší vysvětlení vnitřní funkce tohoto cyklusu.

list<int> base({
                        264,899,648,349,7458,48756,354
               });
for (auto/*int*/ x: base)
cout << x << endl;
Nahlásit jako SPAM
IP: 80.188.252.–
crazy
~ Moderátor
+10
Grafoman
3. 7. 2013   #2
-
0
-

#1 Sefiros
je to "nový" standard jazyka C++ (c++11)

Jaktože členská fce, která přistupuje k iterátoru není nikde pevně daná? Právě proto mají tyto typy jako je list, vector, atd. definované rozhraní pro práci s iterátory... např. mají funkce begin(), end(), které pracují s iterátory. Samozřejmě jich mají mnohem více, ale psát je sem všechny nebudu.

No a operátor auto mluví sám za sebe... ten se rozhodne, jakého bude typu podle toho, co do něho přiřadíš za proměnnou. Nicméně musí být inicializován již v době deklarace.

Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
3. 7. 2013   #3
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
Řešení
vitamin
~ Anonymní uživatel
1092 příspěvků
3. 7. 2013   #4
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Ja len doplnim ze foreach funguje pre kontajnery pre ktore existuje funkcia std::begin s std::end. Takze nemusi byt definovana metoda .begin() a .end(), u takeho pola by to ani neslo, staci specializacia na std::begin a std::end.

Nahlásit jako SPAM
IP: 195.28.77.–
Sefiros0
Návštěvník
3. 7. 2013   #5
-
0
-

to crazy:

Díky za reakci ale přímo neodpovídáš na mnou přednesený problém. Tím že členská funkce není nikde pevně daná myslím to, že můžu vytvořit vlastní kontejner který nebude mít metody begin a end a ani iterátory a tím pádem nepůjde použít tato mutace cyklu for. Pokud to tak je, tak se mi to hrubě nelíbí, neb jazyk by neměl býti spojen s jakoukoli knihovnou. 

to vitamin:

Takže pro dynamicky alokovaná pole tato mutace cyklu for nelze aplikovat...děkuji, už je mi jasné jakým způsobem vnitřně pracuje tento cyklus a opravdu se mi to nelíbí, mám pocit že se z jazyka C++ začíná stávat fakt nechutná cochcárna.

Nahlásit jako SPAM
IP: 80.188.252.–
KIIV
~ Moderátor
+43
God of flame
3. 7. 2013   #6
-
0
-

#5 Sefiros
kdyz nebude mit begin a nebo end, tak nemuzes pouzit tento zapis foru...

to same kdyz begin a end bude vracet neco, co nevraci aktualni prvek pomoci  *iter  tak to asi neprojde...

(ale kdyz budes mit pretizeny unarni operator *, tak to mozna i projde - nestudoval sem funkcionalitu presne)

pravdepodobne to fici na bazi sablon, staci kdyz jde udelat   neco = base.begin(), ++neco, *neco a srovnat neco s base.end() tak to proste pujde...  beztak tydle veci znas uz pri prekladu

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
3. 7. 2013   #7
-
+2
-
Zajímavé

#5 Sefiros
Ja pouzivam nieco taketo:


template <class Iter>
struct range_t{
    Iter begin_;
    Iter end_;

    Iter begin(){return begin_;}
    Iter end(){return end_;}
};

template <class Iter>
range_t<Iter> range(Iter b, Iter e){
    return range_t<Iter>{b, e};
}

template <class Iter>
range_t<Iter> range(Iter b, size_t s){
    return range(b, b + s);
}

int main(){
    int *pole = new int[5]{1, 2, 3, 4, 5};

    for(auto i : range(pole, 5))
        std::cout << i << '\n';

    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý