강의 22:28분경 질문있습니다
246
작성한 질문수 16
강의를 듣고 따라해보다가 궁금한게 생겼는데요 다음과 같이 코드를 짜면 4를 읽지않고 ++it로 5로 넘어간다는 것까지는 이해했습니다
그런데 다음 for 문을 돌리게 되면 이런 에러가 뜨면서 크래쉬가 나는데 어떤 이유인지 궁금합니다
다시 보니 제가 v.begin()을 vector<int>::iterator itBegin에 집어넣어서 사용해서 그런 것 같네요 itBegin을 v.begin()으로 바꾸니 제대로 작동합니다 그런데 그렇게 사용하면 에러가 나는 이유는 뭔가요??
답변 1
1
그게 문제가 아닙니다.
it = v.erase(it); 같은 코드가 들어가면 무조건 바로 break를 해주거나,
if (data == 3)
it = v.erase(it);
else
it++;
같은 형태로 코드가 수정되어야 합니다. (물론 for문의 it++는 제거해야하구요)
0
음... v.erase(it); 과 같은 코드만 썼을 경우는 erase가 it이 누구 소유인지 까지 다 날려서 break를 해줘야 하고 그게 아니라면 it = v.erase(it) 을 해서 소유권을 날려버리지 않게 해줘야 한다고 이해했습니다. 다만 it = v.erase(it)만 했을 경우에는 위 그림에서 3을 빼고 4부터 9까지 값이 앞으로 당겨지기 때문에 for 문의 ++it으로 인해 4의 데이터는 읽히지 않고 5로 바로 넘어가는 경우가 생겨
if (data == 3)
it = v.erase(it);
else
it++;
이렇게 해줘야 한다고 이해했습니다. 근데 제가 질문한 위 그림에서는 다시 해봐도 v.begin()을 vector<int>::iterator itBegin에 넣어서 사용해서 문제가 발생한 것 같은데요...ㅠㅠ
v.begin()으로 하면 정상 작동됩니다!
정상작동 버전

에러 버전

제가 보기엔 똑같아 보여서... 이게 무슨 차이인지 궁금합니다
0
소유권이라기 보다는 그냥 v.erase(it)을 하면,
삭제한 다음 데이터를 가리키는 iterator를 리턴합니다.
만약 하필 마지막 데이터가 삭제된다면, 사실상 v.end()를 리턴하는데
여기서 추가적으로 it++을 하니 난리가 나겠죠.
그리고 위에서 begin, end를 미리 계산한 다음, for에서 사용하면 당연히 의미가 달라집니다.
왜냐하면 erase 자체가 데이터를 제거해서 end 위치가 달라지기 때문이죠.
따라서 erase 등으로 중간 데이터가 달라질 수 있다면 v.begin(), v.end()로 하셔야 합니다.
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
561
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
456
1
strcpy() 구현 관련 질문
0
542
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
477
1
클래스 타입의 포인터 질문합니다
0
560
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
504
1
템플릿 특수화 관련 질문
0
392
1
포인터 관련 질문합니다!
0
275
1
Unable to start assembler. Check your settings.
0
851
2
cpu선택
0
552
1
포인터 질문이 있습니다
0
334
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
592
1
iterator 삭제관련
0
419
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
316
1
15 분 45초 대 질문
0
319
0
스택 프레임 질문합니다!
2
316
1
오른값 참조 in 게임
0
394
0
동적할당 질문이 있습니다
0
460
1
안녕하세요 메모리에 대해 질문드립니다.
0
314
1
함수객체 의 매개변수
0
370
1
복사생성자
0
441
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
431
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
360
1
스택 오버플로우
2
804
1





