[英]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;
一些挑選:
這是我注意到的第一個問題:
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.