我想我已经正确地声明了一个带有对象的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
答案 0 :(得分:16)
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
。
答案 1 :(得分:3)
使用(* iter).member或iter-&gt;成员。
您也可以使用临时工具:
CFileInfo &fileInfo = *iter;
cout << " " << fileInfo.myMember;
另外,对于你正在做的事情,你可能想要一个const_iterator而不是一个(可变的)迭代器。
另外,std :: vector是一个接受typename和allocator的模板,而不是两个类型名。您可以通过剥离第二个模板参数来使用默认分配器:
vector<CFileInfo> unsortedFiles;
vector<CFileInfo>::iterator Iter;
一些挑选:
答案 2 :(得分:1)
这是我注意到的第一个问题:
std::vector
是一个模板。
你有:
vector unsortedFiles;
你需要这样的东西:
vector<CFileInfo> unsortedFiles;
现在我考虑一下,你的模板定义可能刚刚被stackoverflow评论系统解析出来。
答案 3 :(得分:1)
首先纠正你的矢量声明:
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," ")
);
答案 4 :(得分:1)
iter->m_PackLine
或
(*iter).m_PackLine
答案 5 :(得分:0)
谢谢大家,希望我可以为答案授予多个积分:)
litb还指出了我在向量声明中遇到的问题。我删除了向量声明中的第二个参数,它起作用了。
Stackoverflow解析了我的一些代码,下次发布时我会更加小心。
答案 6 :(得分:0)
vector<CFileInfo, CFileInfo&
&GT;根本不会工作。向量的第二个参数是向量使用的分配器,CFileInfo
不符合这些要求,也没有任何引用类型。我想你只想要vector<CFileInfo>
,迭代器和成员会自动返回CFileInfo&
。