2013-03-04 1 views
5

작은 자바 배경으로 C++을 배우려고합니다. 두 목록의 교차를 반환하는 코드를 작성하려고합니다. 저는 개념적으로 올바른 생각을 가지고 있다고 생각합니다. 그러나 컴파일하는 데 아무런 문제가 없으므로 구문에 문제가 있습니다. 내가 필요가 있다고 생각초보자 C++ : 반복자 구문으로 인덱스 구문 변환

#include <iostream> 
using namespace std; 
#include <list> 

template <typename Object> 
list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 

    std::list<Object> result;     
    int pos1 = 0; 
    int pos2 = 0; 

    while (pos1 < L1.size() && pos2 < L2.size()) { 
    if (L1[pos1] > L1[pos2]) { 
     pos1++; 
    } else if (L2[pos2] > L1[pos1]) { 
     pos2++; 
    } else { 
     result.push_back(L2[pos2]); 
     pos1++; 
     pos2++; 
    } 
    } 
    return result; 

} 

것들 : 반복자 (내가 목록에 접근하고있어 방법이 올바르지 않습니다 확신)

+1

나는 (더 잘하면) 더 설명하기 쉽도록 수정했으며, 이것은 비교적 일반적인 문제이며 향후 사용자에게 흥미로울 수 있음을 나타 내기 위해 수정되었습니다. 나는 이것이 좋기를 바란다. – jogojapan

+1

C++의 초보자이기 때문에'std :: list' ...를 절대 사용해서는 안된다는 것을 언급 할 가치가 있습니다. (C++ 클래스에는 문제가 없기 때문에가 아니라 끔찍한 데이터 구조이기 때문에). 컨테이너가 필요할 때, 기본값은 '벡터 '입니다. (따라서 코드가 반복자 대신 인덱스로 작업 할 수 있습니다) – jalf

+0

좋은 지적입니다. 'vector'는 대부분의 경우에 더 좋지만,'list'와'vectors'의 장점과 단점을 알고, 포인터/반복자에 관해 알아야 할 좋은 C++ 코드를 작성하고 싶다면 좋다고 생각합니다. – Ari

답변

4
다음

은 내가 함께 올라와있다 코드입니다 반복자에

변경 POS1과 POS2 :

list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 
    std::list<Object> result;     
    std::list<Object>::iterator pos1 = L1.begin(), pos2 = L2.begin(); 
    while (pos1 != L1.end() && pos2 != L2.end()) { 
    if (*pos1 > *pos2) { //works only if pos1 != L1.end() and pos2 != L2.end() 
     pos1++; 
     ... 

pos1 = L1.begin()L1의 첫 번째 요소 pos1.

++pos1 이동 pos1 목록의 끝에 도달 한 경우

*pos1pos1

pos1 != L1.end() 검사에서 소자를 얻는다 다음 요소로 전진 반복자. pos1 == L1.end() 일 때 pos1에서 요소를 가져올 수 없습니다.

+0

정말 고마워요, 제가 정확히 필요한 것입니다. –

+1

반복자는'const'이어야합니다. –

2

iterator이 아닌 const_iterator이 필요합니다.

모든 C++ 컨테이너 클래스 have typedefs on them에는 포함 된 유형 및 반복기 유형과 같은 항목이 정의되어 있습니다.

귀하의 경우 list<Object>::value_typeObject입니다. 그래서 당신은 말할 수 :

list<Object>::value_type object = Object(); 

이 유사 list<Object>::iterator 컨테이너를 탐색에 사용되는 반복자의 유형입니다. begin()end()을 사용하여 컨테이너의 시작과 끝을 나타내는 반복자를 가져올 수 있습니다. 컨테이너는 당신의 문제로 const 경우

, begin과 끝은 const_iterator를 반환 iterator 반환하지 않습니다. 이 번호는 iterator 유형에 할당 할 수 없습니다. 그것들은 당신이 값을 수정할 수있게 해주는 것과는 다르다.

const_iterator을 사용하여 문제를 해결할 수 있습니다. 그러나이 문제를 해결할 수있는 여러 가지 방법이 있습니다.

  • auto은 유형에 대해 명시 할 필요가 없음을 의미합니다. 그것은 당신에게 옳은 일을합니다.
  • 템플릿에서 일반 매개 변수를 사용할 수 있으므로 다시 명시 할 필요가 없습니다.
  • 표준 라이브러리에는 이미 원하는대로 수행 할 수있는 다양한 알고리즘이 있습니다 (예 : set_intersection).