티스토리 뷰

반응형

어떤 배열 안 혹은 container 안에서 모든 원소들이 어떤 특정 조건을 만족하는지 검사하기 위하여 우리는 for문을 활용하여, 하나씩 검사하는 방법을 사용하였다. 예를 들어, vector<int> num 이라는 container 안에 모든 원소가 모두 0보다 큰지 검사하기 위해 다음과 같은 코드를 작성하였다.

 

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

 

또 이런! 이러한 코드를 작성하는데 7줄을 써야한다고? 시간 낭비에 공간 낭비 따윈 걱정 마시라, 이제는 함수 all_of 를 사용하면 단 한줄만에 작성할 수 있다!

 

1. all_of

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

 

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

 

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

 

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

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

 

구체적으로 이 함수의 역할을 말하자면, 범위 [first, last)에서 모든 값이 각각 pred의 인자로 넣었을 때 true라면 True를 반환하고, 아니라면 False를 반환한다. 예외적으로 empty일 경우 False를 반환한다. 만약 이해가 안된다면, 같은 역할을 하는 코드를 작성하면 다음과 같이 작성할 수 있다.

 

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

 

쉽게 말해, 배열이나 자료형 안에 조건을 모두 만족하는지 확인하는 함수이다.

 

2. 예제 코드

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

 

1
bool is_above_zero = all_of(num.begin(), num.end(), [](int x) { return x > 0; });
cs

 

7줄이나 되던 코드를 한 줄로 압축하였다. 이처럼 특정 배열이나 container를 검사하는데 아주 유용하게 사용할 수 있는 함수이다.

 

하나씩 배열에 접근하기에 시간복잡도는 배열의 길이인 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
글 보관함