C++

algorithm 헤더 파일

monstro 2024. 2. 26. 01:07
728x90
반응형

이 포스팅에서는 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를 사용하지 않는 경우의 코드

 

find를 사용하는 코드

 

반복문을 단 한줄의 코드로 줄일 수 있다는 이점이 존재합니다.

또한 위의 코드에서 보실 수 있듯, find는 반복자(iterator)를 리턴한다는 것을 알 수 있습니다.

그렇다면 계속하여 다른 algorithm함수들도 알아보겠습니다.

 

(2) std::find_if

find_if는 위의 find함수와 비슷하지만, 3번째 인자에 해당하는 조건을 만족하는 첫 번째 요소를 반환합니다.

다음의 코드가 있습니다.

find_if를 사용

 

함수 객체 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_if3번째 인자로 들어온 조건일치하는 요소의 개수를 반환합니다.

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는 지우기보다는 맨 뒤로 보내버리는 기능을 수행하기 때문입니다.

따라서 우리가 원하는 결과를 이끌어내기 위해서는 다음의 추가적인 작업이 필요합니다.

 

추가적인 작업

 

그리고 위의 코드를 조금 더 개선하여

 

 

이런 식으로 한 줄에 표현하는 것도 가능합니다.

728x90
반응형

'C++' 카테고리의 다른 글

람다  (0) 2024.03.18
함수 객체  (0) 2024.03.11
함수 포인터  (0) 2024.03.11
멀티바이트와 유니코드  (0) 2024.02.26
C스타일 문자열과 C++스타일 문자열  (0) 2024.02.26