Frage

Ich hätte gerne zwei Strukturen, die aufeinander verweisen.Insbesondere hätte ich gerne Folgendes:

template<typename Key, typename Value> 
class MyStructure {
public:
  typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
  typedef list<typename MapType::element_type::iterator> ListType;
private:
  MapType map_;
  ListType list_;
}

Dies funktioniert natürlich nicht, da ListType zuvor nicht als Typ deklariert wurde.Wie könnte ich das tun?Wie Sie sehen, verwende ich die Iteratortypen als Zeiger auf die Elemente dieser beiden Strukturen.

Ich dachte daran, das merkwürdig wiederkehrende Vorlagenmuster zu verwenden, kam damit aber nicht weiter.Jemand auf ## c ++ schlug auch vor, Vorlagen-Aliase zu verwenden, aber das schlug auch fehl (zumindest weiß ich nicht, wie ich diese Idee anwenden soll).

Mache ich konzeptionell etwas falsch?Oder vielleicht "nicht im Einklang mit C ++ - Konzepten"?Ich könnte das sicherlich mit void * s machen, aber ich versuche, die Dinge richtig zu machen :)

Danke!

War es hilfreich?

Lösung

Obwohl ich vermutete, dass dies ein Duplikat sein könnte (und in vielerlei Hinsicht ist es das), "Prost und hth.- Alf" weist zu Recht darauf hin, dass es bei der potenziellen doppelten Frage speziell um die Verwendung von ging typedef für so etwas.

In der vorliegenden Frage möchte das OP jedoch wissen, wie allgemein mit der gegenseitigen Einbeziehung in das in der Frage beschriebene Szenario umgegangen werden soll.

Hier ist ein Vorschlag:

#include <list>
#include <map>

template <typename Key, typename Value>
class MyElement;

template <typename Key, typename Value>
class MyStructure
{
public:
  typedef std::map<Key,MyElement<Key,Value> > MapType;
  typedef std::list<MyElement<Key,Value> >    ListType;
};

template <typename Key, typename Value>
class MyElement {
public:
  typename MyStructure<Key,Value>::MapType::iterator  map_iterator;
  typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};

Wie Sie sehen, habe ich einen neuen Datentyp eingeführt MyElement, das sowohl den Listeniterator als auch den Karteniterator enthält.Da es sich eher um eine Klasse als um ein typedef handelt, kann es vorwärts deklariert werden.

Andere Tipps

Das ist leider nicht möglich, so wie Sie es ausdrücken.

Andererseits scheint es mir, dass Sie (angesichts Ihrer Anforderungen) die Speicherung umkehren könnten.

Was ist, wenn Sie ein list von der Values, und dann hatte die Karte auf diese Liste gezeigt?

Dies würde die zyklische Abhängigkeit aufheben.

typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;

(Ich bin mir nicht sicher, ob ich wirklich verstanden habe, was Sie erreichen wollten...)

Eine andere Lösung, die Sie wahrscheinlich in Betracht ziehen sollten, besteht darin, zu prüfen, ob Sie dies in Form von ausdrücken können Steigern.MultiIndex.Wenn mehrere Iterationen / Suchmuster erforderlich sind, steigern Sie.MultiIndex ist oft eine bessere Alternative als eine handgefertigte Lösung, da es die Indizes innerhalb der Werte verschachtelt, um den Speicherplatz zu minimieren.Plus-Konsistenz (dh, dass alle Indizes auf denselben Satz von Elementen verweisen) ist gegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top