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

Iteratory szablony

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
151 wizyt
pytanie zadane 2 lutego 2017 w C i C++ przez Dexterim Dyskutant (8,370 p.)
#include <iostream>
#include <vector>
using namespace std;
//z iteratorem
template<typename Wot>
void wypisz(vector<vector<Wot>> v){
    for(vector<vector<Wot>>::iterator it= v.begin();it!= v.end();it++){
        for (vector<Wot>::iterator j = (*it).begin() ;j != (*it).end() ;j++){
            cout<<*j<<'_';
        }
        cout << endl;
    }
}

void wypisz1(vector<vector<int>> v){
    for(vector<int> i : v){
        for (int j : i ){
            cout<<j<<'_';
        }
        cout << endl;
    }
    
}
void wypisz2(vector<vector<int>> v){
    for(int i = 0 ; i < v.size();i++){
        for (int j = 0 ; j < v[i].size();j++ ){
            cout<<v[i][j]<<'_';
        }
        cout << endl;
    }
    
}

int main(){
vector<vector<int>> v={{1,2,3,4},{1,2,3},{1,2}};
wypisz(v);
wypisz1(v);
wypisz2(v);
vector<vector<double>> v1={{1.,2.,3.,4.},{1.,2.},{1.,2.},{1.,2.,3.}};
wypisz(v1);
}

 

Ktoś może mi powiedzieć dlaczego szablon taki mi nie działa ?

Jeśli pozbedziemy sie szablonu to kod działa

#include <iostream>
#include <vector>
using namespace std;
//z iteratorem
//template<typename Wot>
void wypisz(vector<vector<int>> v){
	for(vector<vector<int>>::iterator it= v.begin();it!= v.end();it++){
		for (vector<int>::iterator j = (*it).begin() ;j != (*it).end() ;j++){
			cout<<*j<<'_';
		}
		cout << endl;
	}
}

void wypisz1(vector<vector<int>> v){
	for(vector<int> i : v){
		for (int j : i ){
			cout<<j<<'_';
		}
		cout << endl;
	}
	
}
void wypisz2(vector<vector<int>> v){
	for(int i = 0 ; i < v.size();i++){
		for (int j = 0 ; j < v[i].size();j++ ){
			cout<<v[i][j]<<'_';
		}
		cout << endl;
	}
	
}



int main(){
vector<vector<int>> v={{1,2,3,4},{1,2,3},{1,2}};
wypisz(v);
wypisz1(v);
wypisz2(v);
//vector<vector<double>> v1={{1.,2.,3.,4.},{1.,2.},{1.,2.},{1.,2.,3.}};
//wypisz(v1);
}

 

2 odpowiedzi

+3 głosów
odpowiedź 2 lutego 2017 przez adrian17 Ekspert (330,920 p.)
wybrane 2 lutego 2017 przez Dexterim
 
Najlepsza

Kompilator GCC/Clang bardzo czytelnie mówi czego brakuje:

<source>:7:9: error: need 'typename' before 'std::vector<std::vector<Wot> >::iterator' because 'std::vector<std::vector<Wot> >' is a dependent scope
for(vector<vector<Wot>>::iterator it= v.begin();it!= v.end();it++){
    ^~~~~~~~~~~~~~~~~~~

Czyli wystarczy dodać `typename`.

for(typename vector<vector<Wot>>::iterator it= v.begin();it!= v.end();it++){

Ale znacznie prościej będzie z auto:

for(auto it= v.begin();it!= v.end();it++){

A jeszcze prościej z pętlą po elementach:

template<typename Wot>
void wypisz(vector<vector<Wot>> v) {
    for (const auto &vec : v) {
        for (const auto &element : vec)
            cout << element << '_';
        cout << '\n';
    }
}

 

komentarz 2 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
Dziękuje smiga. Jeśli chodzi o auto to trochę gubimy imformacje o typach (kosztem ułatwienia). Jeśli chodzi o 3 pętle to juz była napisana w kodzie :)
komentarz 2 lutego 2017 przez adrian17 Ekspert (330,920 p.)

trochę gubimy imformacje

Tylko wizualnie - kompilator widzi typy, IDE też, podpowiadanie działa, jak najedziesz myszką na zmienną to też pokaże typ.

Poza tym tutaj kod jest na tyle czytelny (jak jedziemy po kolejnych elementach vector<vector<X>> to oczywistym jest że jego elementy to vector<X>) że to nie powinien być problem.

+1 głos
odpowiedź 2 lutego 2017 przez criss Mędrzec (172,640 p.)
edycja 2 lutego 2017 przez criss

Widocznie kompilator nie jest w stanie sam ogarnąć typu tylko na podstawie przekazanego argumentu. Za bardzo "schowany" jest. Nie wiem czy są jakieś standaryzowane zasady dedukcji parametru szablonu, ale tutaj widocznie kompilator sobie nie radzi.

Tak zadziała na pewno (jeśli sam powiesz jaki typ podrzucasz template-owi):

wypisz<int>(v);
//...
wypisz<double>(v1);

 

2
komentarz 2 lutego 2017 przez adrian17 Ekspert (330,920 p.)

Tak zadziała na pewno

Sprawdziłeś?

komentarz 2 lutego 2017 przez criss Mędrzec (172,640 p.)
No przyznam się, że nie :P

Podobne pytania

0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 5 stycznia 2018 w C i C++ przez nik Obywatel (1,640 p.)
0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 14 lutego 2019 w C i C++ przez Sic Dyskutant (8,510 p.)
+1 głos
2 odpowiedzi 410 wizyt
pytanie zadane 20 kwietnia 2018 w Nasze projekty przez niezalogowany

90,816 zapytań

139,494 odpowiedzi

313,557 komentarzy

60,313 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...