---C++ 역량 강화---/STL 공부

all_of, any_of, none_of

코리아탑클 2024. 5. 30. 22:05

[[[ all_of  문제]]] 벡터 v가 원소로 가지고 있는 문자열들의 길이가 모두 5 이상인가? 

인자1: begin()

인자2: end()

인자3: 조건자

(교과서 홈페이지 읽는 방법 연습)

p(v)는 v type(VT)가 뭐든  bool로 변환된다. 

또한 value category에 무관하게 bool로 변환된다.

value category는 iterator type을 말하는 듯 하다. random access iterator 이런것들.

수정되지 않는다.

predicate(조건자)이란 bool값을 return하는 callble한 것들이다. 호출 가능한 것은 함수, 함수객체, 람다. 일반 함수도 받을 수 있는지는 잘 모르겠다.

p 조건자의 실행은 많으면 first ~ last만큼 걸린다. 

"application = 함수 호출"로써 사용되는 단어

가능한 구현. 너가 이렇게 구현할 수 있을거야!!

교과서 홈페이지에는 이렇게 구현 방법이 올라와 있어서 참고할 수 있다.

 

[[[원리 분석]]]

1. all_of 함수는 모든 원소가 조건을 만족하는지 검사하는 함수이다. 

하나라도 만족하지 않는다면 false를 반환하고 함수를 빠져나온다.

반대로 모두 만족하면 true를 반환하는데 이 때는 함수를 빠져나오지 않고

다음 원소를 이어서 검사한다.

2. 결과가 v.begin() == v.end()가 된다면 마지막까지 true였다는 의미니까

이때는 진짜로 true를 반환하고 함수를 빠져나온다.

3. 만약 v에 원소가 하나도 없다면 애초에 검사할 것이 없었다는 것이니 true를 반환하고

함수를 빠져나온다. 이 부분이 말로는 헷깔릴 수 있는데 밑에서 정리한 것을 보다 보면 이해할 수 있다.

4. 이렇게 기억하자.

하나라도 틀린 부분이 있다면 false 그 외에 모든 부분은 true를 반환

 

==함수 사용법==

1. begin부터 시작해서 last까지 값을 가져다가 조건자에 집어넣는다.

2. predicate에 조건자를 넣는다.

 

[[[소스 코드]]]

==헤더 파일==

#include <iostream>
#include <algorithm>
#include <vector>

 

해보자

1. all_of 함수를 이용하여 벡터 v의 원소 중에 문자열의 길이가 5보다 작은것이 있나 알 수 있다.

2. return값으로 bool을 리턴하기 때문에 아쉽지만 몇번째 인덱스에 문제가 있는지 알 수 없다.

 

몇 번째 인덱스에 에러가 있는지 확인해 보자.

1. count를 사용해서 인덱스 값을 계산할 수 있다.

2. 캡쳐모드에 외부 변수 count를 참조로 가져왔다.

 

원소를 모두 제거해 보자.

1. 원소를 모두 지운다.

2. 하나라도 틀린 부분이 있다면 false, 나머지는 모두 true를 반환한다고 했다.

3. 정말로 true를 반환했다.



함수를 직접 만들어서 동작 원리를 알아보자.

1. all_of 함수 대신 my_test_all_of 함수를 만들어서 똑같이 동작하도록 만들어 본다.

2. 반복자 begin, end + 조건자 pred를 인자로 가져온다.

3. 모든 원소를 검사하는데 한번이라도 틀리면 false를 리턴하고 맞다면 다음 원소를 검사한다.

4. 최종적으로 한번이라도 틀리면 false, 그 외에는 모두 true를 리턵한다.

5. 원소가 아무것도 없다면 b == e이므로 while문을 빠져나오고 바로 true를 리턴한다.

6. 아래 코드에서 볼 수 있듯 함수, 람다, 함수 객체는 class라서 template으로 가져올 수 있다.

클래스를 함수처럼 사용할 수 있도록 발명한건 엄청난 일이 아닐 수 없다. 

 

... 쉽게 정리하자.

1. 길이가 5 이하인게 있다면 my_all_of 함수에서 false를 반환한다.

2. 길이가 5 이하라면 다음 원소로 이동하여 똑같이 검사한다.

3. while문을 빠져나오면 true를 리턴한다.

4. 즉 길이가 5 이하인게 있다면 false, 그 외에는 모두 true를 리턴한다.

 

 

[[[ any_of  문제]]] 벡터 v가 원소로 가지고 있는 문자열들 중에 길이가 5 이상인 것이 한개라도 있는가?

인자1: begin(), 인자2: end(), 인자3: 조건자

 

[[[원리 분석]]]

1. any_of 함수는 조건에 만족하는 원소가 단 하나라도 있는지 검사하는 함수이다.

 

==함수 사용법==

begin, end, predicate (all_of랑 동일)

 

[[[소스 코드]]]

==헤더 파일==

#include <iostream>
#include <algorithm>
#include <vector>

 

모두 만족할 경우: true

 

하나라도 만족할 경우: true

 

모두 틀릴 경우: false

 

원소가 없을 경우: false

 

[[[함수 구현]]]

1. all_of랑 정 반대다.

2. all_of: 하나라도 틀리면 false 그 외는 모두 true

any_of: 하나라도 옳다면 true, 그 외는 모두 false

 

[[[ None_of  문제]]] 벡터 v가 원소로 가지고 있는 문자열들 중에 길이가 5 이상인 것이 전혀 없는가?

인자1: begin(), 인자2: end(), 인자3: 조건자

 

[[[원리 분석]]]

1. none_of 함수는 모든 원소가 조건에 만족하지 않는지 알아보는 함수이다.

원소가 모두 없어도 true다

 

==함수 사용법==

begin, end, predicate (all_of랑 동일)

 

[[[소스 코드]]]

문자열의 길이가 5 이상인 원소가 단 한개라도 존재하는 경우: false

 

원소가 없을 경우: true

 

문자열의 길이가 5 이상인 원소가 단 한개도 없는 경우: true

 

[[[함수 구현]]]

1. 조건자 함수는 5 <= 길이면 true 아니면 false 리턴

2. 길이가 false이면 none_of 함수는 true를 반환해야 하고 true이면 false를 반환해야 함

3. 아무 원소도 없다면 false를 반환해야 함.

위에 cout를 이상하게 써놔서 헷깔리긴 한데 어쨋은 false를 반환함.

4. 결론: 아무것도 조건에 만족하는게 없다면 true 

원소가 하나도 없어도 true

조건을 만족하는게 단 하나라도 있다면 false

위 아래 코드 둘 다 가능

 

정리

1. all_of: 하나라도 틀리면 false 그 외에는 모두 true

2. any_of: 하나라도 맞다면 true 그 외에는 모두 false

3. none_of: 하나라도 맞다면 false 그 외에는 모두 true

모두 옳은지, 하나만 옳은지, 아무것도 옳은게 없는지 판단하는 것은 어렵지 않지만

원소가 아무것도 없었을 때 어떤 결과값이 나오는지는 암기할 수 없다.

필요할 때 마다 참고하는게 옳다.

 

c++reference에는 표로 정리되어 있다.

 

학습 장소: 한국공학대학교 게임공학과 수업

참고: https://en.cppreference.com/w/

'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글

sample  (0) 2024.05.31
accumulate와 reduce의 차이  (0) 2024.05.31
알고리즘의 분류  (0) 2024.05.30
rotate 함수를 이용한 전광판 만들기  (0) 2024.05.29
high_resolution_clock  (0) 2024.05.29