• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wypisywanie za pomocą iteratora kontenera vector

Object Storage Arubacloud
+2 głosów
626 wizyt
pytanie zadane 31 stycznia 2016 w C i C++ przez Ada Pieńkowska Początkujący (340 p.)

Taki kod:

    template <class T> void wypisz2( vector< vector<T> >& v){
        for( auto it=v.cbegin(); it!=v.cend(); ++it){
            for(auto jt=v.cbegin(); jt!=it; ++jt){
                   cout << *jt << ' ';
 		}
        }
    }

Daje taką odpowiedź na kompilatora g++ 4.8.2 jest następująca:
 

vectorek.cpp: In instantiation of ‘void wypisz2(std::vector<std::vector<T> >&) [with T = int]’:
vectorek.cpp:37:19:   required from here
vectorek.cpp:18:25: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
                    cout << *jt << ' ';

I z tego co rozumiem to operator << ma jakiś problem z przesłaniem iteratora. Tylko nie bardzo rozumiem o co chodzi i jak to naprawić. 
    

4 odpowiedzi

+3 głosów
odpowiedź 1 lutego 2016 przez jegor377 Stary wyjadacz (13,230 p.)

Tak o wypisywaniu danych z kontenera, to zawsze można:

for(auto dana : kontener) cout<<dana<<endl;

Jakby ktoś tu przyszedł i nie wiedział

komentarz 1 lutego 2016 przez draghan VIP (106,230 p.)

Albo lepiej:

for(const auto &dana : kontener) cout<<dana<<endl;

Ode mnie yes.

komentarz 1 lutego 2016 przez jegor377 Stary wyjadacz (13,230 p.)
dokładnie! dałbym Ci plusa gdybym mógł. :D
komentarz 1 lutego 2016 przez efiku Szeryf (75,160 p.)
Czekałem aż ktoś to tu napisze. Ode mnie +1.
komentarz 1 lutego 2016 przez draghan VIP (106,230 p.)
efik, czemu więc sam nie napisałeś? :P
komentarz 1 lutego 2016 przez efiku Szeryf (75,160 p.)
Dałem szansę komu innemu!  Moim zdaniem to lepsze rozwiązanie niż tyle zmiennych. Iterator ja raczej wykorzystywałem do hmm szukania elementu w kontenerze. ( Kontener klasy Book )
komentarz 1 lutego 2016 przez jegor377 Stary wyjadacz (13,230 p.)
aha, no i trzeba też pamiętać, że to rozwiązanie wymaga standardu 11, więc jak coś, to dodaj do linkera po prostu -std=gnu++11
komentarz 1 lutego 2016 przez jegor377 Stary wyjadacz (13,230 p.)

albo choćby jeszcze można:

for(int a=0; a<kontener.size(); a++) cout<<kontener[a]<<endl;

Nie rozumiem po co oni cisną te iteratory w tym przypadku :/

A jak chcesz się odwołać do adresu zmiennej, to piszesz &kontener[a] i to wszystko:)

komentarz 1 lutego 2016 przez Ada Pieńkowska Początkujący (340 p.)
Bo to miało być na iteratorach. Niestety :(
+1 głos
odpowiedź 31 stycznia 2016 przez criss Mędrzec (172,590 p.)
edycja 31 stycznia 2016 przez criss

Nie do końca rozumiem, co znaczy ten error, ale myśle, że kompilator troche zgłupiał bo napisałaś coś kompletnie bez sensu. Dlaczego druga pętla też operuje na iteratorze "głównego" vectora? Powinno to wyglądać tak:

    for( auto it=v.cbegin(); it!=v.cend(); ++it){
        for(auto jt = it->cbegin(); jt != it->cend(); ++jt){
               cout << *jt << ' ';

Druga pętla, skoro wypisuje zawartości vectorów zawartych w głównym vectorze powinna operować na iteratorach vectorów ktorych elementy wypisuje, prawda? :D 

+1 głos
odpowiedź 31 stycznia 2016 przez Dorion300 Szeryf (90,250 p.)

Może to cie zadowoli:

template <class T> void wypisz2(vector< vector<T> > & v){
	for (int x = 0; x < v.size();x++){
		vector<T> fork = v[x];
		for (int y = 0; y < fork.size(); y++)
		{
			cout << fork[y] << " ";
		}
		cout << endl;
	}
}

Więcej kodu, ale działa...Jak i przejrzystszy jest dla mnie.

0 głosów
odpowiedź 31 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Z tego kodu wynika, że wypisujesz obiekt kontenera, a przecież nie ma to sensu - spróbuj wyciągnąć z iteratora obiekt std::vector, a dopiero później z niego odpowiednie dane.

Podobne pytania

+3 głosów
3 odpowiedzi 1,005 wizyt
0 głosów
1 odpowiedź 158 wizyt
0 głosów
0 odpowiedzi 145 wizyt

92,628 zapytań

141,490 odpowiedzi

319,862 komentarzy

62,010 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...