이 포스팅에서는 algorithm헤더 파일을 사용하는 방법을 알아보겠습니다.
구성은 다음과 같습니다.
- std::find
- std::find_if
- std::count_if
- std::all_of
- std::any_of
- std::none_of
- std::for_each
- std::remove
- std::remove_if
먼저 사용하기 위해서는 반드시 코드의 전처리기에 #include <algorithm>을 포함해야 합니다.
algorithm헤더 파일에 대한 더 자세한 설명은
https://learn.microsoft.com/ko-kr/cpp/standard-library/algorithm?view=msvc-170
<algorithm>
자세한 정보:
learn.microsoft.com
위의 공식 문서를 참고해주시면 되겠습니다.
(1) std::find
find함수는 3개의 인자를 받아 작동합니다.
첫 번째 인자는 첫 번째 요소 위치의 주소를,
두 번째 인자는 마지막 요소 위치 바로 다음의 위치 주소를,
세 번째 인자는 찾을 값을 받게 됩니다.
다음의 코드를 보시면 사용하는 방법과 사용하는 이유를 명확하게 아실 수 있을 것입니다.
반복문을 단 한줄의 코드로 줄일 수 있다는 이점이 존재합니다.
또한 위의 코드에서 보실 수 있듯, find는 반복자(iterator)를 리턴한다는 것을 알 수 있습니다.
그렇다면 계속하여 다른 algorithm함수들도 알아보겠습니다.
(2) std::find_if
find_if는 위의 find함수와 비슷하지만, 3번째 인자에 해당하는 조건을 만족하는 첫 번째 요소를 반환합니다.
다음의 코드가 있습니다.
함수 객체 CanDivideBy11은 11로 나눠지는 수를 찾으면 true를 , 그렇지 않으면 false를 리턴합니다.
find_if는 벡터 v의 [0] ~ [99 + 1] 까지의 인덱스를 뒤져 CanDiveBy11에 해당하는 값을 탐색합니다.
따라서 위 코드의 실행값은 '값이 있음'입니다.
(3) std::count_if / std::all_of / std::any_of / std::none_of
위의 함수들은 역할이 비슷하므로 하나로 표시하였습니다.
1) count_if는 3번째 인자로 들어온 조건과 일치하는 요소의 개수를 반환합니다.
2) all_of는 모든 요소가 3번째 인자로 들어온 조건과 일치하는지 판단합니다.
3) any_of는 단 하나의 요소라도 3번째 인자로 들어온 조건과 일치하는지 판단합니다.
4) 마지막, none_of는 모든 요소가 3번째 인자로 들어온 조건과 일치하지 않는지 판단합니다.
(4) std::for_each
for_each는 인자로 들어온 함수 개체를 역시 인자로 넣어준 범위 만큼 적용합니다.
글로는 이해가 힘드니 코드로 보도록 하겠습니다.
따로 for문을 만들어 주지 않아도 벡터의 데이터에 3을 곱할 수 있음을 알 수 있습니다.
(5) std::remove / std::remove_if
remove는 인자에 해당하는 데이터 값을 인자로 넣어준 범위에서 삭제하는 함수입니다.
또 remove_if는 인자에 해당하는 함수 개체에 부합하는 데이터 값을 인자로 넣어준 범위에서 삭제합니다.
그렇다면 코드로 한번 보겠습니다.
무언가 이상한 결과값이 나왔습니다.
우리가 기대한건 짝수에 해당하는 숫자들을 지워 최종적으로 {1, 3, 5}가 나와야 하지만,
출력결과는 엉뚱한 값이 나와버렸습니다.
이러한 결과가 발생하는 이유는
사실 이 remove와 remove_if는 지우기보다는 맨 뒤로 보내버리는 기능을 수행하기 때문입니다.
따라서 우리가 원하는 결과를 이끌어내기 위해서는 다음의 추가적인 작업이 필요합니다.
그리고 위의 코드를 조금 더 개선하여
이런 식으로 한 줄에 표현하는 것도 가능합니다.
'C++' 카테고리의 다른 글
람다 (0) | 2024.03.18 |
---|---|
함수 객체 (0) | 2024.03.11 |
함수 포인터 (0) | 2024.03.11 |
멀티바이트와 유니코드 (0) | 2024.02.26 |
C스타일 문자열과 C++스타일 문자열 (0) | 2024.02.26 |