2016-08-31 3 views
-2

Es ist eine Übung von einer alten Prüfung und ich weiß nicht, wie man es löst.So implementieren Sie eine Zuordnung <Int, Liste <string>> Iterator C++?

Ich habe Klasse namens Wörterbuch und ich möchte einen Iterator über die Schlüssel, die Paarnummern (the_map_key% 2 == 0) implementieren, und ich weiß nicht, wie Operator ++ implementieren, und Funktionen beginnen ein Ende. Hier ist der Code.

class Dictionary{ 
    private: 
    map<int,list<string> > information; 

das ist, was die Übung gibt mir, und die nächste ist das, was ich getan habe, aber ich weiß nicht, wie es weitergeht, natürlich ich einen Konstruktor tun soll, und ein destructor, aber das ist einfach, i haben Schwierigkeiten im Operator ++, und Funktionen beginnen ein Ende.

public: 
    class iterator{ 
     private: 
      *d; 
     public: 
      int & operator *()const;{return *d}; 
      iterator & operator++(){}; 
      iterator begin(){}; 
      iterator end(){}; 

Als Beispiel, wenn Informationen enthält {1, etwas}, {2, etwas}, {5, andere} {6, eine}, Iterator information.begin() sollte Punkt {2, etwas} und Iterator ++ sollte auf {6, an} zeigen.

+1

dies scheint auch unvollständig zu sein, so schwer, Ihnen einen Zeiger in welche Richtung zu geben – Hayt

+0

Was macht es? Soll es durch jedes Element jeder Liste in der Karte iterieren? – Galik

+2

Ihre Erklärung ergibt für mich keinen Sinn. Ihre Beispielpaare sehen aus wie vom Typ '', aber Ihre Map-Paare sind vom Typ '>'. – Galik

Antwort

2

Ihre Iterator-Klasse sollte keinen Zeiger enthalten, sie sollte map<int,list<string> >::iterator enthalten. Ihr operator* ist trivial - nur vorwärts - aber da Sie anscheinend einige Schlüssel verbergen möchten, kann Ihr Dictionary::iterator::operator++ nicht einfach an map<int,list<string> >::iterator weiterleiten. Ich verstehe nicht genau, was du mit den Schlüsseln machen willst, also überlasse ich dir diese Details.

+1

Ich möchte nur die Positionen in der Map springen welcher Schlüsselwert sind die Odds –

+1

@FranciscoRuiz: Das bedeutet, dass Ihr 'operator ++' immer 'operator ++' auf dem darunterliegenden 'std :: map <> :: iterator' aufrufen muss, bis der Schlüssel ungerade ist. Dies unterliegt jedoch einer kleinen Herausforderung: Was genau ist der 'Ende'-Iterator für Ihre Sequenz? Insbesondere wenn Sie einen Iterator für den letzten ungeraden Schlüssel haben, müssen Sie in der Lage sein, diesen zu erhöhen und "Dictionary :: end" zurückzugeben. Aber wie weiß Ihr Iterator, dass er auf den letzten ungeraden Wert zeigt? Die einfachste Lösung könnte darin bestehen, 'std :: map <> :: end' in Ihren Iterator aufzunehmen, damit Ihr' operator ++ 'weiß, wo er aufhören soll. – MSalters

0

Nach dem Versuch, das Problem zu lösen ich den Code geschrieben und ich zu meinem Professor gefragt, ob es richtig war, er sagte mir, es ist Ok, hier so ist der Code von dem, was ich tun wollte:

class Dictionary{ 
private: 
    map<int,list<string> > datos; 
public: 
    class iterator{ 
    private: 
     map<int,list<string> >::iterator p; 
    public: 
     int & operator *()const{ 
      return *p; 
     }; 
     iterator & operator++(){ 
      while(*p->first %2 != 0 || p != datos.end()){ 
      p++; 
      } 
      return p; 
     }; 
     iterator begin(){ 
      p= datos.begin(); 
      while(*p->first %2 != 0){ 
       p++; 
      } 
      return p; 
     }; 
     iterator end(){ 
      p= datos.end(); 
      return p; 
     }; 
    }; 
} 

danke, die Antwort, die du mir gegeben hast, hat mir geholfen, etwas mehr oder weniger gut zu machen. Wenn Sie irgendeinen Fehler oder etwas sehen, was ich besser hätte tun können, sagen Sie mir ty.

Verwandte Themen