|
| Queue () |
| Der Konstruktor initialisiert die Liste als leere Liste.
|
|
void | enqueue (T *item) |
| Das Listenelement item wird an das Ende der Liste angefügt. Mehr ...
|
|
T * | dequeue () |
| Liefert das erste Element der Liste und entfernt es gleichzeitig aus dieser. Mehr ...
|
|
Iterator | begin () |
|
Iterator | end () |
|
T * | remove (T *item, bool(*cmp)(T *, T *)=[](T *a, T *b) {return a==b;}) |
| Mit dieser Methode kann das angegebene Element item aus der. Mehr ...
|
|
void | insert_first (T *item) |
| Fügt das item am Anfang der Liste ein. Mehr ...
|
|
void | insert_after (T *old_item, T *new_item) |
| Fügt das Element new_item hinter dem Element old_item in die Liste ein. Mehr ...
|
|
T * | first () |
| Liefert das erste Element der Liste ohne es zu entfernen. Mehr ...
|
|
T * | next (T *o) |
| Liefert das nächste Element der Liste für ein gegebenes Element.
|
|
template<typename T, QueueLink< T > T::* next_field = nullptr>
class Queue< T, next_field >
Die Klasse Queue realisiert eine einfach verkettete Liste von Objekten mit next Zeiger.
Objekte die verkettet werden sollen enthalten enen QueueLink<T> Feld, welches diese Liste identifiziert. Beispiel:
class Foo {
QueueLink<Foo> next_foo;
}
Das next_foo Feld enthaelt dabei den Verkettungszeiger. Es lassen sich nun Listen mit dem next_foo Verkettungszeiger generieren und verwenden. Insbesondere können diese Queues in C++11 Range Ausdrücken verwendet werden.
Queue<Foo, &Foo::next_foo> list;
Foo a, b, c;
list.enqueue(&a);
list.enqueue(&b);
list.enqueue(&c);
for(Foo * elem : list) {
// use elem
}
Zur Implementierung: tail verweist nicht, wie oft üblich, auf das letzte Element der Liste, sondern auf den next Zeiger des letzten Elements, bzw., solange die Liste noch leer ist, auf den head Zeiger der Liste. Dadurch muss beim Einfügen eines Elements an die Liste nicht überprüft werden, ob bereits Elemente in ihr enthalten sind. Beim Entfernen von Elementen kann auf die Fallunterscheidung allerdings nicht verzichtet werden.