2012-11-09 1 views
0

코드는 너무문제 - 다음 반복기를 들여다 보는 방법?

void buildIt(Object& o, Tokenizer::const_iterator begin, Tokenizer::const_iterator end){ 
    if(begin == end) return; 
    else{ 
    string parent = *begin; 
    bool hasChild = (begin+1) != end; //error: class booost::token_iterator<...> has no member named 'advance' 
    } 
} 

같은 방법은 다음 반복자를 이동하지 않고 유효한지 확인할 수있다?

+0

문제는'begin + 1'입니다. 이 작업은 RandomAccessIterators에서만 지원됩니다. 일반적으로 사용하지 않는 것이 좋습니다. 'boost :: next' /'boost :: prev' 또는'std :: advance'를 사용하십시오. iterator의 상태를 변경하려는 경우에 따라 다름. – pmr

+0

나는 iterator 타입에 따라 std :: advance의 버전을 사용할 것이라고 생각했다. – dchhetri

+0

아니요, advance는'operator +'가 아닌 반복자 유형에 따라 올바른 메소드를 사용할 것입니다. – pmr

답변

1

언제나 반복기를 복사하고 복사본을 증가시킬 수 있습니다. 또는 boost::next을 사용하십시오.

if(boost::next(iter) == end) 
    cout << "..."; 
+0

나는 그것이 조금 나아 졌다고 생각한다. 어쩌면 최신 부스트 버전이이 문제를 해결했습니다 – dchhetri

+0

@ user814628 무슨 문제입니까? – pmr

+0

그 문제는 아니지만 인터페이스에 관한 내 오해 – dchhetri

1
for (Tokenizer::const_iterator i = begin; i!= end; ++i) { 
    ... 
} 
+1

을 사용할 때 for 루프 없이는 아무런 방법이 없다는 것을 미리 알 수 없다고 말했습니까? 함수를 만들지 않고 for-loop를 만들지 않고 처음부터 요소를 확인하면된다. 깨끗한 방법이 필요하다. – dchhetri

+0

코드에 대한 설명은 질문의 원저자 그 이상에 도움이 될 것입니다. – Boeckm

+0

@Boeckm 내 나쁜, hehe, for 루프 자체가 충분히 명확하다고 생각했습니다. – YChen

관련 문제