PDA

Visualizza la versione completa : [c++] template e iteratori


mogre
12-06-2010, 19:01
ho scritto questa funzione e funziona bene: :D

template <class GenericVec> void LogicInterface::printVector(GenericVec &vectorToPrint, string title)
{
cout<<title<<": ( ";
for (int k=0; k<vectorToPrint.size(); k++)
{
cout<<vectorToPrint[k]<<" ";
}
cout<<")"<<endl;
}


ora visto che posso passargli solo i contenitori std che si indirizzano tramite indice, volevo modificarla in qualcosa come:

template <class GenericVec> void LogicInterface::printVector(GenericVec &vectorToPrint, string title)
{
cout<<title<<": ( ";
GenericVec::iterator it;
for (it = vectorToPrint.begin(); it != vectorToPrint.end(); it++)
{
cout<<*it<<" ";
}
cout<<")"<<endl;
}
solo che non funziona, in diversi forum ho letto che dovevo mettere qualcosa come
typedef typename std::GenericVec::iterator it;
però gli esempi erano diversi e per altro neanche funziona :|
idee su come risolvere?

MItaly
12-06-2010, 20:39
Segui l'idioma degli algoritmi della STL: non devi farti passare il contenitore, ma l'iteratore iniziale e finale. In questa maniera il tuo algoritmo si potrà utilizzare senza problemi con qualunque oggetto che fornisca un'interfaccia analoga agli iteratori (puntatori compresi).

mogre
12-06-2010, 22:00
Originariamente inviato da MItaly
Segui l'idioma degli algoritmi della STL: non devi farti passare il contenitore, ma l'iteratore iniziale e finale. In questa maniera il tuo algoritmo si potrà utilizzare senza problemi con qualunque oggetto che fornisca un'interfaccia analoga agli iteratori (puntatori compresi).
grazie! è un ottima idea ora che mi ci fai pensare!!!!
ma evitando di modificare tutto il codice che ho scritto, questo potrei aggiustarlo come volevo fare, secondo te?

mogre
14-06-2010, 15:44
ho risolto così:

template <class GenericIterator> void LogicInterface::printVector(GenericIterator iteratorBegin, GenericIterator iteratorEnd, string title)
{
cout<<title<<": ( ";
while (iteratorBegin != iteratorEnd)
{
cout<<*iteratorBegin<<" ";
iteratorBegin++;
}
cout<<")"<<endl;
}


così posso continuare ad utilizzare anche la vecchia versione, grazie ancora! :D

MItaly
14-06-2010, 15:51
Ottimo; un consiglio ulteriore: dato che di fatto in questo codice ti basta che si tratti di un iteratore in grado di avanzare (non ti servono altre funzionalità), chiama il tipo generico qualcosa come "ForwardIter": risulterà subito chiaro che è sufficiente che l'iteratore passato implementi l'operatore ++ (oltre naturalmente all'operator *).

Loading