2008-11-26 5 views
11

객체가있는 Vector를 올바르게 선언했다고 생각합니다. 그러나 Iterator로 반복 할 때 멤버에 액세스하는 방법을 모르겠습니다.C++ STL 벡터 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, 멤버 액세스 연산자 이후 그렇지 않으면 더 강력하게 바인딩됩니다.

사이드 노드에서 main 함수가 void 대신 int를 반환하도록하십시오. C++에서는 void를 반환하는 것이 유효하지 않습니다.


는이 같은 벡터를 선언

vector<CFileInfo, CFileInfo&> unsortedFiles; 

vector의 두 번째 인수는 또 다른 일이 될 것이다. 코드에 벡터에 두 번째 인수를 제공 할 필요는 없습니다. 그냥이 사용 전주의

vector<CFileInfo> unsortedFiles; 

또 다른 것은 당신이 Iter++를 사용하여 반복자를 증가이다 (postfix increment라고합니다). 이터레이터의 경우 항상 ++Iter을 선호하는데 이는 prefix increment입니다.

+0

두 번째 벡터 템플릿 매개 변수는 할당 자입니다. 벡터가 커질 때 메모리를 요청하는 데 사용됩니다. –

+0

네, 알고 있습니다. 나는이 대답을 복잡하게하고 싶지 않다. :) –

1

이것은 내가 처음으로 느낀 문제 :

std::vector는 템플릿입니다.

당신은이 :

vector unsortedFiles; 

이 같은 필요 : 이제는 그것에 대해 생각

vector<CFileInfo> unsortedFiles; 

를, 템플릿 정의는 단지 유래 코멘트 시스템에 의해 분석 입수했습니다 수 있습니다.

+0

그래, 구문 분석있어, hehe :) – richyz

3

(* iter) .member 또는 iter-> member를 사용하십시오.

또한 사용할 수 있습니다 임시직은 :

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

또한, 당신이 무슨 일을하는지에 대한, 당신은 대신 (변경 가능) 반복자의 const_iterator를 원하는 아마도 것입니다.

또한 std :: vector는 두 개의 typename이 아닌 typename과 할당자를 허용하는 템플릿입니다. 당신은 두 번째 템플릿 인수를 제거하여 기본 할당을 사용할 수 있습니다

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

일부 니트 따기 :

  • 주를 int를 반환해야합니다.
  • for 문에서 iterator 변수를 선언하는 것이 가장 좋습니다.
  • for 루프에서 접미사 연산자 (iter ++) 대신 접두어 ++ 연산자 (++ iter)를 사용하면 런타임 성능이 빨라질 수 있습니다.
  • main() 결말에 대한 의견이 필요하지 않습니다.
1

먼저 올바른 you'r 벡터 선언 :

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&을 반환 할 것이다.