CPP 벡터 반복문 중 원소 지우기
일반적으로 벡터의 원소를 지울 때 erase를 사용하는데 이게 for 문을 돌리면서(iterator++를 하면서) 조건에 맞을 때 삭제하는 코드를 짜면 erase 후 iterator 변수가 가볍게 크래쉬를 발생시켜주신다. 할당해제하고 나면 어떻게 되는지 VS 환경에서 디버거로 본적이 있는데 iterator 변수가 할당해제한 원소를 계속 가리키고 있었던 것으로 기억난다. 아무튼 깔끔하게 프로그래밍 할려면 아래처럼...
std::vector<int *> vIntegers;
// fill integers in the vector.
for(int i = 0; i < 100; i++) {
vIntegers.push_back(new int(i));
}
auto it = begin(vIntegers);
while(it != end(vIntegers)) {
if(**it % 2 == 0) {
printf("%d ", **it);
it++;
} else {
// delete allocated memory of 4bytes, integer size
delete *it;
// erase returns next iterator of removed iterator
it = vIntegers.erase(it);
}
}
아니면 삭제하는 부분을 그대로 for 문으로 나둬도 괜찮다.
for(auto it = begin(vIntegers); it != end(vIntegers);) {
while(it != end(vIntegers)) {
if(**it % 2 == 0) {
printf("%d ", **it);
it++;
} else {
// delete allocated memory of 4bytes, integer size
delete *it;
// erase returns next iterator of removed iterator
it = vIntegers.erase(it);
}
}
}
for 문이 내게는 한 줄에 많은 정보를 줘서 더 가독성이 있다.
'프로그래밍' 카테고리의 다른 글
드라이버 개발 삽질 #1 (0) | 2015.03.12 |
---|---|
ofstream 한글 출력 문제 (0) | 2014.10.22 |
ifstream 64 (0) | 2014.09.25 |
가상 함수 테스트 (0) | 2014.07.05 |
최상위 윈도우 핸들로부터 모든 자식 윈도우 핸들 얻기 (0) | 2014.03.27 |