프로그래밍/C++

#60. Algorithm

코딩하는상후니 2022. 7. 21. 22:06

 


 

* 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