2013-11-20 2 views
1

설정시 OutputIterator를 증가시켜야하는지 혼란 스럽습니다. 문자열을 분할하려고하는 다음 코드를 참조하십시오. 내 문제는 while 루프의 세 번째 줄에있다. * oit = ​​... 또는 * oit ++ = 있는지 여부에 관계없이 코드가 제대로 작동하는 것 같다 ... 누군가가 내게 왜 설명 할 수 있습니까?incrementing back_inserter는 선택 사항입니까?

template<class O> void split(string& s, O oit){ 

     string::iterator jt, it = s.begin(); 

    while(1){ 
     jt = find(it, s.end(), ' '); 
     if(it == s.end() && jt == s.end()) return; 
     *oit++ = string(it, jt); 
     it = jt; 
     if(it != s.end()) it++; 
    } 
} 

...

int main(){ 

     string s; 
     getline(cin, s); 

     vector<string> v; 

     split(s, back_inserter(v)); 
     copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));   

} 

답변

3

std::back_inserter는 기본 컬렉션 push_back를 호출하여 삽입 반복자를 생성합니다. 즉, 올바르게 작동하려면 증분이 필요하지 않습니다.

다른 출력 반복기에서도 똑같은 것은 아니므로 코드가 정확하도록하려면이 특정 경우에는 기본적으로 무시되지만 이벤트는 증가분을 수행해야합니다.

당신이 많은 이하/간단한 코드를 동일한 기본 효과를 얻을 수 있습니다 그냥이 특별한 경우에, 가치가 무엇을 :

string s; 
getline(cin, s); 

replace(s, ' ', '\n'); 
cout << s; 
3

개념은 각 당신이 할 물품이 출력 반복자를 증가해야합니다 . std::back_insert_iterator<T>*it으로 각 할당의 해당 개체에 대해 push_back()을 호출 할 수 있지만 개념에서는 여전히 증가 연산자가 호출되어야합니다. 원칙적으로, 출력 반복자는 함수 호출이 될 수 있지만 포인터에 의해서도 사용되는 동일한 인터페이스에 적합하려면 동일한 연산을 지원해야합니다.

std::back_insert_iterator<Cont>의 사양은 operator++()를 마찬가지로 기본 유형에 typename Cont::value_type 전화 cont.push_back(value) 각각 할당, operator*() 단지, 반복자 자체를 반환한다고.

0

표준 반복기는 일반 프로그래밍과 함께 사용할 때 원시 포인터와 기능적으로 동일하기 때문에 두 부분 모두 작동합니다. 원시 포인터를 사용할 때는 후속 주소에 도달하기 위해 증가시켜야합니다.

관련 문제