뭉근 : 느긋하게 타는 불

일반적으로 벡터의 원소를 지울 때 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