2008-11-26 9 views
11

Ich glaube, ich habe einen Vector mit einem Objekt korrekt deklariert. Aber ich weiß nicht, wie ich auf seine Mitglieder zugreifen kann, wenn ich mit Iterator loope.C++ STL Vector Iterator Zugriff auf Mitglieder eines Objekts

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

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

Nicht sicher, ob ich die richtige Terminologie verwendet habe, aber schätze die Hilfe! Dank

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 
+0

Rich - Wenn Sie Fragen stellen, verwenden Sie bitte die Schaltfläche "Code", um Ihren Quellcode zu formatieren. Die Codeformatierung behält Einrückung bei und macht einige Syntaxhervorhebung. Auf diese Weise erhalten Sie eine schnellere Antwort. –

Antwort

16
cout << " " << *Iter; 

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

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

Alternativ ist die folgende äquivalent zu:

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

Sie haben Klammern zu setzen um * Iter, da der Mitglied-Zugriffsoperator bindet sonst anders.

Auf einem Seitenknoten, machen Sie Ihre Hauptfunktion Rückkehr int statt void. Die Rückgabe von void ist in C++ nicht gültig.


Sie erklären den Vektor wie folgt aus:

vector<CFileInfo, CFileInfo&> unsortedFiles; 

Das zweite Argument für vector eine andere Sache sein sollte. Es ist nicht erforderlich, dass Ihr Code dem Vektor ein zweites Argument gibt. Nur diese verwenden:

vector<CFileInfo> unsortedFiles; 

Eine andere Sache, die ich bemerkt, ist der Iterator mit Iter++ erhöhen (genannt postfix increment). Für Iteratoren bevorzugen Sie immer ++Iter, was prefix increment heißt.

+0

Der zweite Vektor Template-Parameter ist ein Allocator. Es wird verwendet, um Speicher anzufordern, wenn der Vektor wächst. –

+0

ja ich weiß. Ich möchte diese Antwort nicht komplizieren :) –

1

Dies ist das erste Problem, das ich bemerkt:

std::vector ist eine Vorlage.

Sie haben:

vector unsortedFiles; 

Sie brauchen so etwas wie:

vector<CFileInfo> unsortedFiles; 

Jetzt, wo ich darüber nachdenke, kann Ihre Template-Definition wird von dem Stackoverflow Kommentarsystem analysiert aus nur bekommen hat.

+0

Ja, es wurde aussortiert, hehe :) – richyz

3

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

Sie können auch Provisorien verwenden:

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

Auch für das, was du tust, dann würden Sie wahrscheinlich einen const_iterator anstelle eines (änderbare) Iterator wollen.

Darüber hinaus ist std :: vector eine Vorlage, die einen Typnamen und einen Zuordner akzeptiert, nicht zwei Typnamen. Sie können den Standard allocator verwenden, indem das zweite Template-Argument Strippen:

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

Einige Spitzfindigkeiten:

  • Haupt sollte einen int zurück.
  • Es wäre wahrscheinlich am besten, Ihre Iterator-Variable in der for-Anweisung zu deklarieren.
  • Es wäre wahrscheinlich in der Laufzeitleistung schneller, den Präfix ++ Operator (++ iter) anstelle des Postfixoperators (iter ++) in Ihrer for-Schleife zu verwenden.
  • Keine Notwendigkeit für Ihren Kommentar über main() Ende.
1

erste richtige you'r Vektor Erklärung:

vector<CFileInfo > unsortedFiles; 

Als nächstes müssen Sie einen Ausgabeoperator für die 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; 
} 

der Regel entweder Sie die Ausgabeoperator ein Freund von machen Ihre Klasse oder stellen Sie eine öffentliche Druckmethode bereit, die einen Stream verwendet. In beiden Fällen können Sie dann auf die Mitglieder zugreifen und sie manuell zur Ausgabe streamen.

Sobald Sie die Output-Iterator definiert haben Sie Ihre Schleife ändern können die Standard-Bibliothek-Versionen zu verwenden:

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

oder

(*iter).m_PackLine 
-1

Dank allen wünsche ich mehrere Punkte für die Antworten gewähren könnte :)

litb wies darauf hin, auch ein Problem, das ich in meiner Erklärung des Vektors ist. Ich habe das zweite Argument in der Vektordeklaration entfernt und es hat funktioniert.

Stackoverflow analysiert etwas von meinem Code, ich werde beim nächsten Mal vorsichtiger sein.

0

vector<CFileInfo, CFileInfo&> wird überhaupt nicht funktionieren. Der zweite Vektorparameter ist der Zuordner, den der Vektor verwendet, und CFileInfo erfüllt diese Anforderungen nicht und auch keinen Referenztyp. Ich denke, Sie wollen nur vector<CFileInfo>, die Iteratoren und Mitglieder werden CFileInfo& automatisch zurückgeben.

Verwandte Themen