Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69

    [c++] template e iteratori

    ho scritto questa funzione e funziona bene:
    codice:
    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:
    codice:
    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?

  2. #2
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69
    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69
    ho risolto così:
    codice:
    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!

  5. #5
    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 *).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.