Nie umiem <list> i iteratorów :)

Nie umiem <list> i iteratorów :)
A0
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:6
0

Aktualnie trenuje listy, i niestety nie umiem za dużo z nimi zrobić. Zatrzymałem się, gdy chciałem zamienić typ na klasę.
Mój kod:

Kopiuj
#include <iostream>
#include <list>

using namespace std;

class Klasa {
public:
    int liczba;
    std::string slownie;
 Klasa(int licz, std::string slown) : liczba(licz), slownie(slown) {};

 void test(){ std::cout << slownie;}

};

int main()
{
    list<Klasa> lista;
    lista.push_back(Klasa(1,"jeden"));
    lista.push_back(Klasa(2, "dwa")); 

    for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )
    {
       // std::cout<<*iter<<endl; // BOOM!!
       // **NIE WIEM CO TUTAJ ..**
       // JAK wyświetlić Klasa.slownie? 
       // Jak wywołać Klasa::test?
    }
}
Lucas Darkstorm
Lucas Darkstorm
  • Rejestracja:około 13 lat
  • Ostatnio:około 4 lata
2

Co tutaj? Wystarczy zrobić taki myk:

Kopiuj
for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )
{
       iter -> test() ;
}

Czyli odwołujesz się do obiektów klasy z poziomu wskaźnika / iteratora przy pomocy operatora ->.

edytowany 2x, ostatnio: Lucas Darkstorm
Shakaz
  • Rejestracja:ponad 10 lat
  • Ostatnio:10 miesięcy
  • Postów:184
0

@Lord Darkstorm
(*iter).test()
FTFY :)

Do autora wątku: do kodu dołącz <string> jeszcze.

edytowany 2x, ostatnio: Shakaz
Lucas Darkstorm
Lucas Darkstorm
Za późno - sam się poprawiłem ;p.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
6
Kopiuj
for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )

A po co tak teraz pisać?

Nie ładniej tak?

Kopiuj
for(auto it = begin(lista), e = end(lista); it != e; ++it){
    cout << it->slownie << ", ";
}

Albo jeszcze wygodniej:

Kopiuj
for(Klasa const& k : lista){
    cout << k.slownie << ", ";
}

Przy okazji: staraj się używać preinkrementacji (++it zamiast it++) jeśli to możliwe. Unikasz wtedy tworzenia zbędnych kopii, których kompilator nie zawsze może uniknąć.


edytowany 2x, ostatnio: kq
spartanPAGE
const auto&amp; moim zdaniem super w pętli foreach
kq
W sumie racja, chociaż ja się bardziej skłaniam ku auto&amp;&amp; jeśli prawdą jest, że potrzebuję non-const dostęp, lub kontener jest const.
spartanPAGE
Ah, dla mnie r-values nie są jeszcze naturalne, cały czas wydają mi się jakieś takie agresywne i odpychające :P
kq
Tutaj masz akurat przykład tego, co Scott Meyers nazywa uniwersalną referencją ( http://accu.org/var/uploads/journals/Overload111.pdf / http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11 ). Mi bardziej pasuje pisanie auto&amp;&amp; zawsze i as_const wedle uznania: http://melpon.org/wandbox/permlink/8lg7yvQdTD7iMUPr
Azarien
jaką przewagę tutaj daje auto&amp;&amp; nad auto&amp;?
kq
Tak jak widać w linku powyżej, auto&amp;&amp; jest wynikowo auto const&amp; lub auto&amp; w zależności od tego, czy input jest const.
Lucas Darkstorm
Lucas Darkstorm
Czyli nie trzeba pamiętać, czy coś jest const czy też nie, jeżeli się użyje tego zapisu. Spoko opcja :).
kq
Bardzo polecam podlinkowny artykuł bądź prelekcję Scotta Meyersa. O ile nazwa uniwersalna referencja nie jest oficjalna, to wiele wyjaśnia.
Lucas Darkstorm
Lucas Darkstorm
Jasne, na pewno go przejrzę. Ja w sumie i tak muszę ogarnąć do końca C++11 i teraz nowy C++14. Mimo, że parę rzeczy z C++11 już umiem używać, to i tak jest jeszcze sporo do nauczenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.