* find / find_if
=> 해당 값 / 조건 에 맞는 데이터를 찾아줌.
vector<int> v;
for (int i = 0; i < v.size(); ++i)
v[i] = i + 1;
{
auto findIt = find(v.begin(), v.end(), 10);
if (v.end() != findIt)
{
cout << "찾음!!" << endl;
}
struct CanDivideBy11
{
bool operator()(int n) { return (n % 11 == 0); }
};
auto findIfIt = find_if(v.begin(), v.end(), CanDivideBy11());
auto findIfIt = find_if(v.begin(), v.end(), [](int n) { return (n % 11 == 0); });
cout << *findIfIt << endl;
}
template <class _InIt, class _Pr>
_NODISCARD _CONSTEXPR20 _InIt find_if(_InIt _First, const _InIt _Last, _Pr _Pred) { // find first satisfying _Pred
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst) {
if (_Pred(*_UFirst)) {
break;
}
}
=> *_UFirst 를 받을 수 있고 bool 을 리턴하는 함수를 넣어주어야함.
* count / count_if
=> 해당 값 / 조건을 맞는 데이터를 세어줌.
Create(v, 20);
count(v.begin(), v.end(), 10);
struct IsOdd
{
bool operator()(int n) { return (n % 2) != 0; }
};
int cntNum = count_if(v.begin(), v.end(), IsOdd());
* all_of / any_of / none_of
all_of => 모든 데이터가 홀수입니까 ??
any_of : 홀수인 데이터가 하나라도 있습니까 ??
none_of : 모든 데이터가 홀수가 아닙니까??
bool b1 = all_of(v.begin(), v.end(), IsOdd());
bool b2 = any_of(v.begin(), v.end(), IsOdd());
bool b3 = none_of(v.begin(), v.end(), IsOdd());
*for_each
=> 모든 데이터들에게 동일한 작업을 원할 때.
struct MultiBy3
{
int operator()(int n) { return n *= 3; }
};
for_each(v.begin(), v.end(), MultiBy3());
* remove / remove_if
*remove 동작 과정
1 4 3 5 8 2
4 8 2 5 8 2
=> 왜 이렇게 될까??
iterator 범위까지 조건에 맞는 원소를 찾고,
찾은 데이터를 이동생성자를 사용해 해당 컨테이너 첫번째부터 채워간다.
즉, 덮어씌움.
마지막에 이제 채워야할 위치(iterator) 를 반환한다.
즉, 이후에 반환되는 Iterator 을 이용해 그 위치부터 끝까지 지워주어야하는 작업 필요.
template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
first = std::find_if(first, last, p);
if (first != last)
for(ForwardIt i = first; ++i != last; )
if (!p(*i))
*first++ = std::move(*i);
return first;
}
auto removeIt = remove(v.begin(), v.end(), 5);
v.erase(removeIt, v.end());
auto removeIfIt = remove_if(v.begin(), v.end(), IsOdd());
v.erase(removeIfIt, v.end());
본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
'프로그래밍 > C++' 카테고리의 다른 글
#62. auto (0) | 2022.07.22 |
---|---|
#61. 중괄호 초기화 { } (0) | 2022.07.22 |
#59. set & multimap & multiset (0) | 2022.07.21 |
#58. Map (0) | 2022.07.21 |
#57. deque (0) | 2022.07.21 |