Domanda

Mi piacerebbe avere due strutture che indicano l'altra.Nello specifico, mi piacerebbe avere quanto segue:

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_;
}
.

Ovviamente questo non funzionerà da quando ListType non è dichiarato in precedenza come tipo.Come potrei fare questo?Come puoi vedere sto usando i tipi di iteratori come suggerimenti per questi elementi di questi due strutture.

Stavo pensando di usare il modello di modello ricorrente curiosamente, ma non poteva andare da nessuna parte con quello.Qualcuno su ## C ++ ha anche suggerito di utilizzare gli alias del modello, ma non è riuscito pure (almeno, non so come usare questa idea).

Sto facendo qualcosa di sbagliato, concettualmente?O forse "non in linea con i concetti C ++"?Potrei certamente farlo con Void * s, ma sto cercando di rendere le cose nel modo giusto :)

Grazie!

È stato utile?

Soluzione

Anche se sospettassi che potrebbe essere un duplicato (e in molti modi è), "Cheers e Hth. - ALF" è giusto per indicare che la potenziale duplicazione duplicata era specificatamente sull'uso di typedef per questo tipo di cosa.

Tuttavia, nella domanda attuale, l'OP vorrebbe sapere come generalmente affrontare l'inclusione reciproca nello scenario descritto nella domanda.

Ecco un suggerimento:

#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;
};
.

Come puoi vedere, ho introdotto un nuovo tipo di dati MyElement, che contiene il iteratore elenco così come il iteratore della mappa.Perché questa è una classe piuttosto che un typedef, può essere dichiarato in avanti.

Altri suggerimenti

Questo sfortunatamente non è possibile, nel modo in cui lo esprimi.

D'altra parte, mi sembra che (dato le tue esigenze) è possibile invertire lo stoccaggio.

Cosa succede se hai usato un list del Values, quindi ha avuto il punto della mappa a questa lista?

Questo spezzerebbe la dipendenza ciclica.

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

(Non sono sicuro se ho capito davvero cosa stavi cercando di ottenere ...)

Un'altra soluzione che probabilmente dovresti considerare è vedere se riesci a esprimere questo in termini di boost.multiindex .Quando sono necessari diversi modelli di iterazioni / ricerca, boost.multiindex è spesso un'alternativa migliore della soluzione fatta a mano, in quanto interlava gli indici all'interno dei valori in modo da ridurre al minimo la memoria.Più coerenza (cioè, avendo tutti gli indici che fanno riferimento allo stesso set di elementi) è un dato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top