[英]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.