2017-12-21 4 views
0

'helper'함수에서 set 요소가 출력되면 '2'요소가 제거 된 것으로 예상됩니다. 그러나 실제 결과는 여전히 '1 2 3 4 5'입니다.
그러나 세트의 크기는 4입니다.
근본적인 문제가 궁금합니다. helper함수의 C++ erase()

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

void helper(set<int> myset, set<int>::iterator it) { 
    myset.erase(it); 

    cout << "size:" << myset.size() << endl; 
    for(auto el : myset) 
     cout << el << " "; 
} 


int main(int argc, const char * argv[]) { 
    set<int> myset = {1,2,3,4,5}; 

    auto it = myset.begin(); 
    it++; 
    helper(myset,it); 
} 
+7

'void 헬퍼 (set myset'는 복사본을 전달합니다.) 반복자는 원본과 만 연결됩니다. – StoryTeller

답변

3

itmain에서 myset에 반복자이다. 그러나 helper에있는 mysetmain에 의 복사본입니다. 즉, helper 함수의 it은 해당 함수에서 사용중인 myset의 요소를 나타내지 않으므로 정의되지 않은 동작입니다. 당신은 helpermyset을 참조해야 할 것입니다. 시도해보십시오.

void helper(set<int> & myset, set<int>::iterator it) 

편집 : 이것은 또한 알아 차리지 못할 수도있는 다른 문제를 해결합니다. 이전에는 값으로 myset을 사용했을 때 로컬 사본 만 변경했습니다. 복사본에서 요소를 지우고 인쇄하려고 시도하지만 main의 함수에 전달 된 원래 myset에는 영향을 미치지 않습니다. 이를 참조로 지정하면 helper 함수에서 myset으로 변경하면 실제로 원래의 myset이 변경됩니다.

+1

호출 사이트에서 객체에 사용한 것과 같은 이름을 인자로 사용합니다. make 나중에 질문 할 때 이름 재사용을 피할 것을 고려해보십시오. –

+2

값으로 전달하는 것은 또 다른 문제가 있음을 언급해야합니다. OP가 반복자 대신 키를 전달한다고해도 복사 변경은 원본 세트에 영향을 미치지 않습니다. – Slava

+0

조언을 해주셔서 감사합니다. 그러나 myset.size()의 값이 예상대로 4가되는 이유는 무엇입니까? –

1

set을 도우미 함수에 전달합니다. 그래서 당신의 반복자는 함수에서 만들어진 복사본이 아니라 원래의 집합을 참조합니다.

심지어 이라면 반복기가 여전히 유효합니다. 사본을 변경하는 것은 원하는 것이 아닙니다. 원본을 변경하고 싶습니다.

원하는대로 설정하려면 도우미에게 참조 세트를 전달하십시오.