2017-11-04 17 views
1

벡터를 가져 와서 단순히 (수동으로) 반전하는 함수를 생성하려고합니다. 나는 reverse()의 존재를 알고 있었지만, "벡터 반복자"라는 문제에 부딪혔다. 그리고 교육적 목적을 위해, 나는 그것이 무엇을 의미하는지 알고 싶다. 나는이 문제를 연구 해봤는데 누군가 (이 포럼에서) vect.end()는 정의에 의해 참조 해제 될 수 없다고했지만, 내 이해에서 reverse_iterator를 사용하는 것은 끝을 뒤집어서 논리를 따른다. vect.rend는 참조 할 수 없어야합니다.벡터 반복자가 역 참조가 가능하지 않습니다. (수동으로 벡터를 반홖하려고 시도합니다.)

vector<int> reverseVector(vector<int>); 

int main() 
{ 
    vector<int> vec; 

    for (int i = 0; i < 11; i++) 
    { 
     vec.push_back(i); 
    } 

    vec = reverseVector(vec); 

    for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) 
    { 
     cout << *it << " "; 
    } 
    cout << endl; 

    return 0; 
} 

vector<int> reverseVector(vector<int> vect) 
{ 
    vector<int>::reverse_iterator ritr; 
    for (ritr = vect.rbegin(); ritr != vect.rend(); ritr++) 
    { 
     vect.insert(vect.begin(), *ritr); 
     vect.pop_back(); 
    } 
    return vect; 
} 

답변

1

은 역순 반복기 인을 무효로하는 벡터에서 요소를 삭제합니다 (뒤에서 터지는 요소).


당신은 벡터의 절반을 반복이 아이크, 요소를 교환 할 수 있습니다 :

void swap(int& a, int& b) { 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

vector<int> reverseVector(vector<int> vect) { 
    const size_t origin_size = vect.size(); 
    for(size_t i = 0; i < origin_size/2; ++i) 
     swap(vect[i], vect[origin_size - 1 - i]); 
    return vect; 
} 
1

문제는 참조 취소 가능성 또는 기타 rend()과 관련이 없습니다. iterator를 무효화하는 동안 iterating하는 동안 벡터를 수정하고 있습니다.

원래 질문에 대한 답변을 얻으려면 reverse_iterator은 앞으로 반복기에 비해 "끝을 뒤집을"만이 아닙니다. rbegin()end() - 1이고, rend()begin() - 1이다. 당신이 벡터에 요소를 추가하는 경우

1

ritr 오류를 따라서 dereferencable

벡터 반복자를하지 무효화 할 수있다.

따라서 인덱스를 루프 변수로 사용하거나 역순으로 작업하는 경우 복사 (임시) 벡터를 사용하는 것이 좋습니다.

1

모두 insertpop_back 멤버 함수는 벡터를 수정하고 반복자를 무효로합니다.

1

디자인 문제로 팁 : 실제로 무엇을하고 있는지 알지 못하는 한 항상 함수에서 const-reference를 사용하십시오. 그래서 당신은 이와 같은 함정에 빠지지 마십시오. 예 :

vector<int> reverseVector(const vector<int> &vect) 

이제 vect를 수정할 수 없기 때문에이 문제가 발생하지 않습니다.