2008-11-26 127 views
11

我想我已经正确地声明了一个Vector对象。但是,当我使用Iterator循环时,我不知道如何访问它的成员。C++ STL向量迭代器访问对象的成员

在我的代码中,该行--- >> 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

Rich - 发布问题时,请使用“代码”按钮来格式化您的源代码。代码格式化将保持缩进并进行一些语法高亮显示。你会以这种方式获得更快的响应。 – 2008-11-26 21:02:01

回答

16
cout << " " << *Iter; 
如果 CFileInfo

只会工作一个超载的operator<<可以输出你的结构。您的结构可以输出单个成员,而不是像这样:

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

另外,以下是相当于:

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

你必须把周围的括号* Iter项目,因为成员访问运算符否则绑定更厉害。

在一个侧面的节点上,让你的main函数返回int而不是void。使其返回void在C++中无效。


您申报载体是这样的:

vector<CFileInfo, CFileInfo&> unsortedFiles; 

的第二个参数vector应该是另一回事。你的代码根本不需要为矢量提供第二个参数。只要使用此:

vector<CFileInfo> unsortedFiles; 

我注意到的另一件事是你增加使用Iter++迭代器(称为postfix increment)。对于迭代器,始终更喜欢++Iter,这被称为prefix increment

+0

第二个矢量模板参数是一个Allocator。它用于向量增长时请求内存。 – 2008-11-26 21:24:38

1

这是第一个问题,我注意到:

std::vector是一个模板。

您有:

vector unsortedFiles; 

你需要的东西,如:

vector<CFileInfo> unsortedFiles; 

现在我想想,你的模板定义可能刚刚得到由计算器评论系统解析出。

+0

是的,它被解析出来了,呵呵:) – richyz 2008-11-26 21:04:27

3

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

您还可以使用临时变量:

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

而且,你在做什么,你可能想要一个常量性的,而不是一个(可变)的迭代器。

此外,std :: vector是一个接受类型名和分配器的模板,而不是两个typenames。您可以通过剥离第二个模板参数使用默认分配:

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

有些吹毛求疵:

  • 主要应返回一个int。
  • 最好在for语句中声明你的迭代器变量。
  • 在for循环中,使用前缀++运算符(++ iter)而不是后缀运算符(iter ++)可能会使运行时性能更快。
  • 不需要您对main()结尾的评论。
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," ") 
      ); 
1
iter->m_PackLine 

(*iter).m_PackLine 
-1

感谢所有,希望我能给予多点的答案:)

litb还指出,我在我的矢量的声明有问题。我删除了向量声明中的第二个参数,它工作。

Stackoverflow解析了一些我的代码,我会在下次发布时更加小心。

0

vector<CFileInfo, CFileInfo&>根本不起作用。向量的第二个参数是向量使用的分配器,并且CFileInfo不符合这些要求,也没有任何引用类型。我想你只是想vector<CFileInfo>,迭代器和成员会自动返回CFileInfo&