2009-07-21 9 views
0

Ich möchte zwei Container erstellen, die Iteratoren enthalten. Ich würde das gerne hoffentlich tun, ohne dazwischenliegende/indirekte Typen einzuführen. Ist dies möglich oder werden Iterator-Typen verwendet, abhängig von der Größe des Datentyps des Containers?C++ Container mit Iteratoren und Zirkelreferenzen

Hier ist ein Beispielcode, die ich Kompilieren bekommen möchte:

#include <map> 
#include <deque> 
#include <string> 

class mapvalue_t 
{ 
    public: 
    std::deque< std::map<std::string,mapvalue_t>::iterator >::iterator i; 
}; 

typedef std::map<std::string,mapvalue_t> maptype_t; 
typedef std::deque<maptype_t::iterator> queuetype_t; 

int main(void) 
{ 
    maptype_t m; 
    queuetype_t q; 
} 

Es macht nichts, kompiliert es jetzt. Ich hatte eine Warteschlange dort, anstatt meine beabsichtigte Deque :)

+1

Ich bin mir nicht sicher, Ihre Frage nicht länger zu bearbeiten - eine Frage ist eine gute Übung. –

Antwort

2

Dies funktioniert, wenn Sie eine deque anstelle einer queue verwenden. Queue ist kein Container, sondern eine Fassade, so dass der Aufruf ::iterator nicht unterstützt wird.

Von cplusplus.com:

Warteschlangen werden als Container-Adapter implementiert, die Klassen sind, die ein eingekapseltes Objekt einer bestimmten Containerklasse als zugrunde liegende Behälter zu verwenden, einen bestimmten Satz von Elementfunktionen bieten ihm Elemente zuzugreifen. Elemente werden in den "Rücken" des spezifischen Containers geschoben und platzen von seiner "Front".

1

Sie sollten beim Speichern von Iteratoren sehr vorsichtig sein. Durch das Ändern der Sammlung können alle Iteratoren leicht ungültig gemacht werden. Sie würden viel besser eine ID oder einen (verwalteten) Zeiger speichern.

+0

In der Tat. Ihre gespeicherte Liste von Iteratoren wird jedes Mal ungültig, wenn die Karte in irgendeiner Weise geändert wird. Sie sollten Schlüsselwerte im Mapping speichern. – Kieveli

+0

Nicht ganz richtig. Bei Karten und Listen werden durch das Einfügen und Löschen von Elementen keine Iteratoren ungültig gemacht (mit Ausnahme desjenigen, der gelöscht wird). Meine Frage sollte eine Liste und keine Deque drin haben, aber ich weiß nicht, ob ich die Frage noch einmal aktualisieren sollte. – Alex77

+0

Wenn wir uns auf bestimmte Implementierungen verlassen. Ich glaube nicht, dass dies vom Standard garantiert wird. – DanDan