[ C++ : #include <algorithm> ]
find
find_if
count
count_if
all_of
any_of
none_of
for_each
remove
remove_if
STL의 사용함에 있어서 장점은, 일반화된 함수를 쓴다면 다른 프로그래머가 쓴 코드를 봐도, 어떤 기능을 하는지 한 눈에 파악하기 쉬울 뿐더러, 컨테이너가 바뀌어도 그대로 동작한다는 것.
[1] find
number와 동일한 element가 존재하는지 탐색
auto itFind = ::find(v.begin(), v.end(), number);
[2] find_if
Predicate의 조건에 맞는 element가 존재하는지 탐색
auto itFind = ::find_if(v.begin(), v.end(), [](const int N) { return (N % 11) == 0; });
아래부터 나오는 함수들은 이제 find, find_if와 비슷하다고 보면 된다.
[3] count_if
struct IsOdd
{
bool operator()(int N)
{
return (N % 2) != 0;
}
};
int cnt = ::count_if(v.begin(), v.end(), IsOdd());
[4] all_of, any_of, none_of
// 모든 데이터가 홀수인가요?
bool b1 = ::all_of(v.begin(), v.end(), IsOdd());
// 홀수인 데이터가 하나라도 있나요?
bool b2 = ::any_of(v.begin(), v.end(), IsOdd());
// 모든 데이터가 홀수가 아닌가요?
bool b3 = ::none_of(v.begin(), v.end(), IsOdd());
[5] for_each
전부 순회해서, 세 번째 인자에 들어간 함수 객체 실행
::for_each(v.begin(), v.end(), MultiplyBy3());
==== ==== ==== ==== ==== ==== ==== ====
[6] remove, remove_if
유의해야할 점은, remove해야할 element를 직접 삭제하는 것이 아니라, 오른쪽에 밀어두고 결과적으로 남는 데이터들만 좌측에 남겨두는 방식으로 동작함.
return하는 iterator는 더 이상 사용되지 않는 데이터들의 첫번째를 가리킴.
auto it = ::remove_if(v.begin(), v.end(), IsOdd());
v.erase(it, v.end()); // 명시적으로 삭제하는 추가적인 작업 필요, 뒷부분만 삭제하므로 효율적
[7] unique
remove와 동일하다. unique한 데이터들만 좌측에 남겨두고, 우측에는 중복되는 남은 값들이 남아있으니 호출 후에는 erase()를 통해 명시적으로 삭제해줘야 한다.
'컴퓨터공학 > C++' 카테고리의 다른 글
[C++] 함수 객체, 콜백 함수 (0) | 2024.11.19 |
---|---|
[More Effective C++] 다중 상속 (0) | 2024.11.17 |
[C++] 함수 포인터 (0) | 2024.11.13 |
[C++] using (0) | 2024.11.09 |
[C++] noexcept (0) | 2024.11.09 |