티스토리 뷰

반응형

어떤 배열 안에 어떤 특정 조건을 만족하는 원소가 있는지 검사하기 위해 우리는 배열 안의 모든 원소를 둘러보며, 하나씩 비교하는 방법을 사용하였다.

 

예를 들어, 배열 arr 안에 정수 0이 있는지 for문을 활용하여 작성하면 다음과 같이 작성할 수 있다.

 

1
2
3
4
5
6
7
bool is_in = false;
for (int i = 0; i < arr.size(); i++) {
    if (arr[i] == 0) {
        is_in = true;
        break;
    }
}
cs

 

이런! 코드의 길이가 7줄이나 된다고? 너무나도 귀찮고 귀찮다. 이를 위하여 C++ 에는 함수 any_of 가 만들어져 있다!

 

1. any_of

(※ https://www.cplusplus.com/reference/algorithm/any_of/ 에서 함수에 대한 정보를 확인할 수 있다.)

 

C++의 알고리즘 관련이 담긴 헤더 <algorithm.h>에서의 any_of 함수는 다음과 같은 구조를 가진다.

 

bool any_of (InputIterator first, InputIterator last, UnaryPredicate pred)

 

any_of는 3개의 인자를 받고 1개의 값을 반환한다.

  • InputIterator first : 배열이나 어떤 container의 자료형의 시작부 혹은 포인터
  • InputIterator last : 배열이나 어떤 container의 자료형의 끝부 혹은 포인터
  • UnaryPredicate pred : 배열이나 어떤 container를 인자로 받아 bool 형태를 반환하는 함수, 본래 인자를 수정하지 않는 함수여야 하며, 함수의 포인터 혹은 함수가 올 수 있다.
  • Return Value : pred의 반환값이 true인 데이터가 적어도 하나 존재할 경우 True, 만약 데이터가 비어있거나 pred의 반환값이 모두 false일 경우 False

 

구체적으로 이 함수의 역할을 말하자면, 범위 [first, last)에서 pred에 들어가는 함수를 만족하는 값이 존재하면 True, 없다면 false를 반환한다. 예외적으로 empty일 경우 false를 반환한다. 만약 이해가 안된다면, 같은 역할을 하는 코드를 작성하면 다음과 같이 작성할 수 있다.

 

1
2
3
4
5
6
7
8
template<class InputIterator, class UnaryPredicate>
  bool any_of (InputIterator first, InputIterator last, UnaryPredicate pred) {
  while (first!=last) {
    if (pred(*first)) return true;
    ++first;
  }
  return false;
}
cs

 

쉽게 말해, 배열이나 자료형 안에 만족하는 값이 있는지 확인해주는 함수이다.

 

2. 예제 코드

위에서 7줄이나 된 코드를 람다 함수와 any_of 를 이용하면 단 한 줄로 바꿀 수 있다.

 

1
bool is_in = any_of(arr.begin(), arr.end(), [](int x) { return x == 0; });
cs

 

정말 간단하지 않은가? 이처럼 조건을 만족하는 원소가 있는지 확인할 때 아주 유용하게 사용할 수 있는 함수이다.

 

하나씩 배열에 접근하기에 시간복잡도는 배열의 길이인 O(n) 을 가지며, 만약 배열의 범위를 초과하여 index에 접근할 경우 undefined behavior 가 발생할 수 있다.

 

도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍

지적이나 오타 수정 댓글 환영합니다!!

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함