2011-04-05 4 views
0

누군가 아래 코드가 작동하고 사실을 나타내는 이유를 설명 할 수 있습니까? v1.begin()은 반복자를 생성하지만 비교 함수 내에서 v1.begin()의 값을 검사하면 디버깅 할 때 벡터의 첫 번째 요소 값이 표시됩니다.벡터 반복기 및 템플릿 함수

이것은 템플릿 내에서 반복자의 이름을 지정하기 위해 typename vector<T>::iterator을 사용해야한다는 사실과 관련이 있습니까? 누군가가이

덕분에

template<class U, class V> bool compare(const U &v1, const U &v2, const V &v3) { 
    if ((v1 == v2) && (v2 == v3)){ 
     return 1; 
    } else { 
     return 0; 
    } 
} 


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

int main() { 

    vector<int>  v1(10,3); 
    vector<int>  v2(10,3); 
    bool iComp = compare(v1.begin(), v1.begin() + 2, v2.begin()); 
    cout << typeid(v1.begin()).name() << " " << *v2.begin() << endl; 

    return 1; 
} 
+2

'iComp'는'false'로 평가됩니다. 그래서 나는 그 질문을 이해하지 못한다. –

+0

맞습니다. iComp의 값은 확인하지 않았지만 단순히 함수의 v1, v2 및 v3 값을 확인하지 않았습니다. 어떤 이유인지 모르지만 VC++ 2010에서 v1, v2 및 v3을 가리키면 함수가 3 변수의 값을 3으로 표시하므로 True를 생성한다고 가정합니다. 그것은 논리가 나에게 말하고있는 그대로 그것이 doesnt하는 것이 좋다. 죄송합니다. 신중하게 확인하지 않았기 때문에 죄송합니다. – RandomCPlusPlus

+2

Visual C++는 이터레이터가 가리키는 *을 유용하게 표시합니다. 그것이 당신이보고있는 것입니다. 'v1','v2'와'v3'는 모두 반복자입니다. –

답변

1

compare 반환 true 정교한 수 있다면 그것은 좋은 것입니다 경우와 세 반복자가 같은 객체를 가리키는 경우에만 가능합니다. 이터레이터가 다른 유형의 객체를 가리키면 컴파일 오류가 발생할 수 있습니다.

반복자는 인수가 모두 다르기 때문에 다른 객체를 가리 킵니다. 따라서 comparefalse을 반환합니다. 이 결과는 버려집니다.

그런 다음 프로그램은 std::vector<int>::iterator 유형을 식별하는 고유 한 문자열을 인쇄합니다. 이것은 std, vectoriterator이라는 단편을 언급하는 긴 문자열이거나 <vector> 구현이 typedef T *iterator을 사용하는 경우 "정수로의 포인터"는 간단히 pi 일 수 있습니다.

마지막으로 의 첫 번째 값이기 때문에 마지막으로 10을 인쇄합니다.