Kreisbezug
-
Gibt es in der STL ein Template für Kreisbezüge?
Ich möchte sowas wie 5 Personen im Kreis nachbilden:
wenn ich vom letzten einen weiter gehe, möchte ich beim ersten wieder ankommen und zurück...
-
Nicht wirklich, aber du kannst dir eine geeignete verkettete Liste selber schreiben, wenn du es brauchst (jedes Element hat einen Zeiger auf seinen Nachfolger und von außen hast du einen Zeiger auf den "ersten" - der Nachfolger des letzten Elements ist wieder der Listenanfang).
-
Du kannst auch vom letzten Feldelement zum ersten hüpfen, dann hast du deinen Kreis und brauchst dich nicht stundenlang mit ner verketteten Liste quälen.
-
Für Container aus der STL (auch die verketteten Listen) kannst du einen angepassten Iterator schreiben. Hier ist ein Anfang als lauffähiges Beispiel:
#include <list> #include <iterator> #include <iostream> using namespace std; template<typename T, template <typename> class TList = list> class cyclic_iterator { TList<T> &m_theList; typename TList<T>::iterator m_iter; public: cyclic_iterator(TList<T> &theList) : m_theList(theList), m_iter(theList.begin()) { } void operator++() { ++m_iter; if (m_iter == m_theList.end()) m_iter = m_theList.begin(); } T &operator*() { return *m_iter; } }; int main() { list<int> myList; myList.push_back(4711); myList.push_back(13); cyclic_iterator<int> cycle(myList); for(int i = 0; i < 5; ++i, ++cycle) cout << *cycle << "\n"; }
-
#define RUNDHERUM_BIS_SCHWINDELIG_WIRD int main() RUNDHERUM_BIS_SCHWINDELIG_WIRD { int i=0; char *fuenf_im_karusell[] = { "Miss Piggy", "Minnie Maus", "Kermit", "Donald", "CStoll", 0 }; while( fuenf_im_karusell[i] ) { cout << fuenf_im_karusell[i++] << endl; if ( !fuenf_im_karusell[i] ) i = 0; } return 0; }
-
Ist da auch noch ein sechster Platz frei ?
Will mal ne Runde mitfahren.
-
@Iterat0r
das sieht gut aus, aber lässt sich mit VC++ 2003 nicht kompilieren:
error C3201: Die Vorlagenparameterliste für die Klassenvorlage 'std::list' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'TList' überein

-
Das liegt wohl daran, daß list<> zwei Template-Parameter hat (der zweite ist der Allokator und fällt im täglichen Bedarf nicht auf - aber für diese Template-Template-Parameter brauchst du ihn). Versuch's mal so:
template<typename T,typename C = list<T> > class cyclic_iterator {...};(btw, die Adapter-Iteratoren der STL sind auch nicht mit Templates instanziiert, sondern mit Template-Spezialisierungen ;))