vector 내부 요소 제거하기


벡터에 값을 넣는 것은 쉬운 반면, 벡터 안에 있는 요소를 제거하는 것은 약간 까다롭다.
먼저 벡터가 제공하는 제거 관련 멤버함수는 다음의 3가지 이다.


erase() 어느 요소를 지울지 알아서, 그 특정요소만 지울 때
pop_back() 가장 나중의 요소를 지울 때
clear() 모든 요소를 지울 때

이 함수를 가지고 멍청하게 생각을 해보면 Brute-force하게 루프를 돌면서 원하는 요소를 얻는 단순한 방법을 할 텐데, 이렇게 하지 말고 잘 생각을 해보자.

STL에서 제공하는 알고리즘을 이용하면, 의외로 쉽게 해결된다.
remove_if() 알고리즘을 생각해보자.

알고리즘을 쓸려면 을 인클루드 해야한다.

remove_if 는 3개의 인자를 갖는다.


iterator _First 작업할 범위의 첫번째 요소
iterator _Last 작업할 범위의 마지막 요소
predicate _Pred 검사할 문장을 서술해 놓은 함수

서술문(Predicates)
Predicates는 Yes/No를 반환하는 함수 포인터 혹은 함수 그 자체를 말한다.

<DIV class=geshi>

<LI class=li1>

<DIV class=de1><SPAN class=co1>// remove all strings containing the value of </SPAN></DIV></LI>

<LI class=li1>

<DIV class=de1><SPAN class=co1>// szRemove from vector vs. </SPAN></DIV></LI>

<LI class=li1>

<DIV class=de1> </DIV></LI>

<LI class=li1>

<DIV class=de1>FindStr fs; </DIV></LI>

<LI class=li1>

<DIV class=de1> </DIV></LI>

<LI class=li1>

<DIV class=de1>fs.<SPAN class=me1>iMode</SPAN> = FM_CONTAINS; </DIV></LI>

<LI class=li1>

<DIV class=de1>fs.<SPAN class=me1>szMatchStr</SPAN> = szRemove; </DIV></LI>

<LI class=li1>

<DIV class=de1>vs.<SPAN class=me1>erase</SPAN><SPAN class=br0>(</SPAN>std::<SPAN class=me2>remove_if</SPAN><SPAN class=br0>(</SPAN>vs.<SPAN class=me1>begin</SPAN><SPAN class=br0>(</SPAN><SPAN class=br0>)</SPAN>, vs.<SPAN class=me1>end</SPAN><SPAN class=br0>(</SPAN><SPAN class=br0>)</SPAN>, FindMatchingString<SPAN class=br0>(</SPAN>&fs<SPAN class=br0>)</SPAN><SPAN class=br0>)</SPAN>, vs.<SPAN class=me1>end</SPAN><SPAN class=br0>(</SPAN><SPAN class=br0>)</SPAN><SPAN class=br0>)</SPAN>;</DIV></LI></DIV>

이렇게 지운다.