簡體   English   中英

C ++ STL Vector Iterator訪問Object的成員

[英]C++ STL Vector Iterator accessing members of an Object

我想我已經正確地聲明了一個帶有對象的Vector。 但是,在使用Iterator進行循環時,我不知道如何訪問它的成員。

在我的代碼中,行--- >> cout <<“”<< * Iter;

如何打印成員的內容? 喜歡* Iter.m_PackLine ???

不確定我是否使用了正確的術語,但感謝您的幫助! 謝謝

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
cout << " " << *Iter;

僅當CFileInfo有一個可以輸出結構的重載operator<<時才會起作用。 您可以輸出結構的各個成員,如下所示:

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

或者,以下內容相當於:

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

你必須在* Iter周圍加上括號,因為成員訪問運算符會綁定更嚴格的。

在side-node上,使main函數返回int而不是void。 使其返回void在C ++中無效。


你聲明這樣的向量:

vector<CFileInfo, CFileInfo&> unsortedFiles;

vector的第二個參數應該是另一回事。 您的代碼不需要為向量提供第二個參數。 只要用這個:

vector<CFileInfo> unsortedFiles;

我注意到的另一件事是你使用Iter++增加迭代器(稱為postfix increment )。 對於迭代器,總是更喜歡++Iter ,它被稱為prefix increment

使用(* iter).member或iter-> member。

你也可以使用臨時工:

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

另外,對於你正在做的事情,你可能想要一個const_iterator而不是一個(可變的)迭代器。

另外,std :: vector是一個接受typename和allocator的模板,而不是兩個類型名。 您可以通過剝離第二個模板參數來使用默認分配器:

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

一些挑選:

  • main應該返回一個int。
  • 最好在for語句中聲明你的iterator變量。
  • 在for循環中使用前綴++運算符(++ iter)而不是后綴運算符(iter ++)可能會更快地運行時性能。
  • 不需要你對main()結尾的評論。

這是我注意到的第一個問題:

std::vector是一個模板。

你有:

vector unsortedFiles;

你需要這樣的東西:

vector<CFileInfo> unsortedFiles;

現在我考慮一下,你的模板定義可能剛剛被stackoverflow注釋系統解析出來。

首先糾正你的矢量聲明:

vector<CFileInfo > unsortedFiles;

接下來,您需要為您的類定義輸出運算符:

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

通常,您可以將輸出運算符作為類的朋友,也可以提供采用流的公共打印方法。 無論哪種方式,您都可以訪問成員並手動將它們流式傳輸到輸出。

一旦定義了輸出迭代器,就可以更改循環以使用標准庫版本:

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

要么

(*iter).m_PackLine

謝謝大家,希望我能為答案授予多個積分:)

litb還指出了我在向量聲明中遇到的問題。 我刪除了向量聲明中的第二個參數並且它有效。

Stackoverflow解析了我的一些代碼,下次發布時我會更加小心。

vector<CFileInfo, CFileInfo& >根本不起作用。 向量的第二個參數是向量使用的分配器, CFileInfo不滿足這些要求,也沒有任何引用類型。 我認為你只需要vector<CFileInfo> ,迭代器和成員將自動返回CFileInfo&

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM