繁体   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