12 Stimmen

C++ STL-Vektor-Iterator, der auf Mitglieder eines Objekts zugreift

Ich denke, ich habe einen Vektor mit einem Objekt richtig deklariert. Aber ich weiß nicht, wie man auf seine Mitglieder zugreifen, wenn Schleife mit Iterator.

In meinem Code ist die Zeile --->> cout << " " << *Iter;

Wie drucke ich den Inhalt der Mitglieder aus? Wie *Iter.m_PackLine?

Ich bin mir nicht sicher, ob ich die richtige Terminologie verwendet habe, aber danke für die Hilfe! Danke

class CFileInfo
{
  public:
      std::string m_PackLine;
      std::string m_FileDateTime;
      int m_NumDownloads;
};

void main()
{
  CFileInfo packInfo;

  vector<CFileInfo, CFileInfo&> unsortedFiles;
  vector<CFileInfo, CFileInfo&>::iterator Iter;

  packInfo.m_PackLine = "Sample Line 1";
  packInfo.m_FileDateTime = "06/22/2008 04:34";
  packInfo.m_NumDownloads = 0;
  unsortedFiles.push_back(packInfo);

  packInfo.m_PackLine = "Sample Line 2";
  packInfo.m_FileDateTime = "12/05/2007 14:54";
  packInfo.m_NumDownloads = 1;
  unsortedFiles.push_back(packInfo);

 for (Iter = unsortedFiles.begin(); Iter != unsortedFiles.end(); Iter++ )
 {
    cout << " " << *Iter; // !!! THIS IS WHERE I GET STUMPED
    // How do I output values of the object members? 
 }
}  // end main

17voto

Johannes Schaub - litb Punkte 479831
cout << " " << *Iter;

wird nur funktionieren, wenn CFileInfo hat eine überladene operator<< die Ihre Struktur ausgeben kann. Sie können stattdessen einzelne Mitglieder der Struktur wie folgt ausgeben:

cout << " " << Iter->m_PackLine;

Alternativ dazu ist das Folgende gleichwertig:

cout << " " << (*Iter).m_PackLine;

Sie müssen *Iter in Klammern setzen, da der Operator "member-access" sonst den Thighter bindet.

Auf einem Nebenknoten, machen Sie Ihre Hauptfunktion zurückgeben int anstelle von void. machen es zurückgeben void ist nicht gültig in C++.


Sie deklarieren den Vektor wie folgt:

vector<CFileInfo, CFileInfo&> unsortedFiles;

Das zweite Argument für vector sollte eine andere Sache sein. Für Ihren Code ist es überhaupt nicht nötig, dem Vektor ein zweites Argument zu geben. Verwenden Sie einfach dies:

vector<CFileInfo> unsortedFiles;

Eine andere Sache, die ich bemerkt habe, ist, dass Sie den Iterator mit Iter++ (genannt postfix increment ). Bei Iteratoren sollten Sie immer ++Iter genannt wird. prefix increment .

3voto

strager Punkte 86191

Verwenden Sie (*iter).member oder iter->member.

Sie können auch Provisorien verwenden:

CFileInfo &fileInfo = *iter;
cout << " " << fileInfo.myMember;

Auch für das, was Sie tun, würden Sie wahrscheinlich eine const_iterator anstelle eines (mutable) Iterator wollen.

Außerdem ist std::vector eine Vorlage, die einen Typnamen und einen Zuweiser akzeptiert, nicht zwei Typnamen. Sie können den Standard-Allokator verwenden, indem Sie das zweite Template-Argument entfernen:

vector<CFileInfo> unsortedFiles;
vector<CFileInfo>::iterator Iter;

Einige Erbsenzählereien:

  • main sollte einen int zurückgeben.
  • Es wäre wahrscheinlich am besten, Ihre Iterator-Variable in der for-Anweisung zu deklarieren.
  • Es wäre wahrscheinlich schneller, den Präfix-Operator ++ (++iter) anstelle des Postfix-Operators (iter++) in Ihrer for-Schleife zu verwenden.
  • Ihr Kommentar zur Beendigung von main() ist überflüssig.

1voto

Dave Punkte 865

Dies ist das erste Problem, das mir aufgefallen ist:

std::vector ist eine Vorlage.

Sie haben:

vector unsortedFiles;

brauchen Sie etwas wie:

vector<CFileInfo> unsortedFiles;

Jetzt, wo ich darüber nachdenke, kann es sein, dass Ihre Vorlagendefinition gerade vom Stackoverflow-Kommentarsystem ausgewertet wurde.

1voto

Martin York Punkte 245363

Korrigieren Sie zunächst Ihre Vektordeklaration:

vector<CFileInfo > unsortedFiles;

Als nächstes müssen Sie einen Ausgabeoperator für Ihre Klasse definieren:

std::ostream& operator<<(std::ostream& str,CFileInfo const& data)
{
       // Do something here
       /* Potentailly you could do this
        *    But this requires that this function be a friend of the class

       str << data.m_PackLine << ":"
           << data.m_FileDateTime << ":"
           << data.m_NumDownloads << ":";

       *  Or you could do this

           data.print(str);  // Make print a public const method.

       */

       return str;
}

Normalerweise machen Sie den Ausgabeoperator entweder zu einem Freund Ihrer Klasse oder stellen eine öffentliche Druckmethode bereit, die einen Stream annimmt. In beiden Fällen können Sie dann auf die Elemente zugreifen und sie manuell an die Ausgabe weiterleiten.

Sobald Sie den Ausgabe-Iterator definiert haben, können Sie Ihre Schleife so ändern, dass sie die Versionen der Standardbibliothek verwendet:

std::for_each(unsortedFiles.begin()
              unsortedFiles.end()
              std::ostream_iterator<CFileInfo>(std::cout," ")
             );

1voto

orip Punkte 69138
iter->m_PackLine

ou

(*iter).m_PackLine

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X