2015-02-01 2 views
3

아래 함수를 컴파일 할 때 컴파일 오류가 발생합니다. 왜 2 차 for 루프에 yt != endIx이 불법입니까? '! ='없음 연산자 '표준 : _ Vector_iterator >>'형의 왼쪽 피연산자를 취하는 발견루프 종료 조건 오류에 대한 cpp 벡터

void printDebug(vector <int> ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto endIx = ar.end() - it; 
     for (auto yt = ar.begin(); yt != endIx ; yt++) 
     { 
      cout << *it << " : " << endIx ; 
     } 
     cout << endl; 
    } 
} 
(또는 허용 가능한 변환이없는)

오류 C2678 이진

혼란을 피하기 위해 자동 종료 반복자의 이름을 endIx로 변경했습니다.

답변

9

ar.end() - it의 유형이다 std::vector<int>::difference_type (반복기 사이의 거리의 유형을주는 container trait)는 그 하지 반복기이다.

대신 루프에서 ar.begin() + end

사용 반복자 산술 :

void printDebug(vector <int> ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto end = ar.end() - it; // end is of type vector <int>::difference_type 
     for (auto yt = ar.begin(); yt != ar.begin() + end; yt++) 
     { 
      cout << *it << " : " << end; 
     } 
     cout << endl; 
    } 
} 

참고 :

당신은 값이 아닌, const를 참조하여 벡터를 통과해야합니다

void printDebug(const vector<int>& ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto end = ar.end() - it; // end is of type vector <int>::difference_type 
     for (auto yt = ar.begin(); yt != ar.begin() + end; yt++) 
     { 
      cout << *it << " : " << end; 
     } 
     cout << endl; 
    } 
} 
+1

메모 ("const 참조로 전달"및 "반복자 한 쌍을 지나쳐라.") 문제와 관련이 없다. IMO 분산시키기 – anatolyg

+0

@anatolyg이 제거됨 – quantdev

+1

Meh, 반복자 쌍은 스타일에 대한 질문 일 수있다. 그러나 나는 반드시 벡터를 전달해야한다는 것을 분명히한다. 가치보다는 const ref로. –