2014-12-14 2 views
0

그냥 iterator와 비교하여 const_iterator를 사용하는 것에 관한 질문입니다. 보다 구체적으로 distance()를 사용합니다. 아래는 사용자가 입력하는 "fav_games"목록을 응용 프로그램의 앞 부분에서 찾아내는 기본 코드입니다. 나는 또한 번호 매기기 목록을 출력하기 위해 벡터의 '색인'을 쓰레기로 만들고 싶었다.iterator VS const_iterator, distance()와 함께 사용하기

부분 코드 :

int main() 
{ 
    vector<string> fav_games; 
    vector<string>::const_iterator iter; // const_iterator no worky with "distance()" 

    if (fav_games.size() > 0) { 
     cout << "\n\nCurrent game list: \n"; 
     for (iter = fav_games.begin(); iter != fav_games.end(); ++iter) 
     { 
      cout << distance(fav_games.begin(), iter) << ". " << *iter << endl; 
     } 
    } 

    return 0; 
} 

내 질문은 왜 "const_iterator를"I "가 반복자"대신 사용하도록 강요하고, 여기서 작동하지 않습니다이다. 그 뒤에있는 '이론'을 찾고 있습니다. "distance()"는 "const_iterator"가 아닌 "iterator"와 "iterator"를 나타냅니다. ..왜?

그냥 내가 "const_iterator를"사용하는 경우 참조 컴파일 오류 :

오류 1 오류 C2782 : 'iterator_traits를 < _Iter> :: difference_type 표준 : 거리 (_INIT, _init)': 템플릿 매개 변수 '_INIT' 모호하다 z : \ micah \ C++ \ favgames \ favgames \ favgames.cpp 49 1 favgames

고마워!

+1

의 두 인수의 유형 'distance'는 같아야합니다 (템플릿 인자를 추론 할 경우). 그래서 C++ 11에서는'.cbegin()'과'const_iter'를 사용해야했습니다. RandomAccessIterators의 경우 '-'도 사용할 수 있습니다. 'iter - fav_games.begin()' – dyp

+0

굉장합니다, 고마워요! – Micah

답변

1

대신을 시도해보십시오

vector<string>::const_iterator b, iter, e; 

if (fav_games.size() > 0) { 
    cout << "\n\nCurrent game list: \n"; 
    for (b = fav_games.begin(), iter = b, e = fav_games.end(); iter != e; ++iter) 
    { 
     cout << distance(b, iter) << ". " << *iter << endl; 
    } 
} 

distanceconst_iterator 경우, 또는 두 개의 iterator 경우 아무 문제가 없습니다. 당신의 실수는 그들을 섞는 데 있었다.

여전히 O(n) 번의 전화는 distance으로 전화하는 것이 좋습니다. 나중에, 물론 한 5 월이 한 단계를 가서 전혀 반복자를 명시 적으로 사용하지

vector<string>::const_iterator iter, e; 
size_t i; 

if (fav_games.size() > 0) { 
    cout << "\n\nCurrent game list: \n"; 
    for (i = 0, iter = fav_games.begin(), e = fav_games.end(); iter != e; (++iter), (++i)) 
    { 
     cout << i << ". " << *iter << endl; 
    } 
} 

C++ 11에서 : : 그냥 카운터를 사용

if (fav_games.size() > 0) { 
    int i = 0; 
    cout << "\n\nCurrent game list: \n"; 
    for (const string& game : fav_games) 
    { 
     cout << (i++) << ". " << game << endl; 
    } 
} 
+0

정말 고마워! C++ 멍청한 놈. 그냥 밧줄을 배우는 것. – Micah

+0

@dyp : 호출이 루프 안에 있습니다. O (1)은 어때? 예, RandomIterator의 경우 거리가 저렴하지만 간단한 카운터는 아직 저렴하고 컨테이너가 변경되면 신비하게도 비싸지 않습니다. –

+0

아, 나는 너를 오해했다. 그러나 정수 증가가 아닌 각 반복에서 포인터 뺄셈의 성능에 관심을 가지는 이유는 무엇입니까? – dyp

관련 문제