STL map에서 원하는 것들을 처리하고 삭제하기

purewell의 이미지

map에서 key값 이외, second부분의 어떠한 값을 비교해서
해당 원소를 데이터 처리하고, 삭제하려고 합니다.

삭제될 원소는 다수가 될 수 있는데,
이럴 때 어떻게 해야하나요.

remove_if 쓰려고 했더니 안 되던데...

winner의 이미지

compile 오류인가요?

혹시 remove_if 를 하고 난 후에 container 안에 든 원소 수가 줄어들지 않았다는 뜻인가요? STL 에서 algorithm 은 container 자체는 건드리지 않기 때문에 remove, remove_if, unique, unique_if 를 쓰신 후 반환되는 반복자를 사용해서 erase 해야 합니다.

map<int, int> test = 초기화;
test.erase( remove_if( test.begin(), test.end(), 술어 ), test.end() );

STL 의 정렬 relation 은 strict weak ordering 이라는 점 유의하세요.

purewell의 이미지

^ -^);;; 컴파일 오류입니다.
Effective 같은 책에서는 remove_if는 선형 구조인 list/vector 등에서나 유용하다고 나와있습니다.

[url]http://snaiper80.cafe24.com/wiki/wiki.cgi?Remove_if와_map_같이_쓸_시에_컴파일_에러_문제_해결[/url]
http://www.pie.pe.kr/wiki/moin.cgi/EffectiveStlSum1

구글에서 찾았는데,
삽질 좀 더 해봐야겠습니다.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

winner의 이미지

어쩐지 source 작성해서 compile 해보고 싶더라니...

map 은 pair<const key, value> 이기 때문에 변화가 불가능합니다.
즉 key 쪽에서 말이죠.
이유는 tree 구조를 통해 정렬된 상태를 유지하기 위해서겠죠.

반복문을 사용하시면서 지우실 것은 erase 해야겠네요.

굳이 algorithm 을 사용하시겠다면 remove_copy_if 에
새로운 map 의 삽입반복자를 넣어주어야겠네요.

map old = 초기화, new;

remove_copy_if(old.begin(), old.end(), inserter(new, new.end()), 술어);

생각해보니 삽입반복자를 algorithm 에 넘기면 container 가 변화하는군요..

purewell의 이미지

답변 감사드립니다. ^ -^)=b

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

winner의 이미지

죄송합니다.

생각해보니 new 는 예약어군요... -_-. 앞으로는 신중히 글을 쓰겠습니다.