9-10. STL - 알고리즘

Crat3 ㅣ 2023. 6. 19. 19:32

이전 예제 실습에서 구현한 코드를 알고리즘을 이용하여 간단하게 구현할 수 있다.

 

1. 특정 값 찾기 - find / find_if

(1) find

vector<int>::iterator findIt = find(v.begin(), v.end(), number);
// find(시작 위치, 끝 위치, 찾을 숫자)

find는 결과로 반복자를 리턴한다. 따라서 vector가 아닌 list에서도 사용할 수 있다.

 

(2) find_if

            struct Divby11
            {
                bool operator()(int n)
                {
                    return (n % 11) == 0;
                }
            };
            
            vector<int>::iterator findIt = find_if(v.begin(), v.end(), Divby11());

find_if의 세번째 항인 조건항은 함수의 형식을 띄어야 한다.

결과는 반복자를 리턴한다.

 

2. (특정 조건일 때)갯수 세기 - count / count_if

(1) count

 

(2) count_if

            struct IsOdd
            {
            	bool operator()(int number)
                {
    	            return (number % 2) != 0;
	            }
            };

int n = count_if(v.begin(), v.end(), IsOdd());

 

3. 데이터 판단 - all_of / any_of / none_of

(1) all_of

모든 데이터가 조건과 일치하는지 반환

 

(2) any_of

데이터가 단 하나라도 조건과 일치하는지 반환

 

(3) none_of

어떤 데이터도 조건과 일치하지 않는지 반환

 

 

4. 데이터 조작 - for_each

struct Multi3
{
	void operator()(int& n)
    {
    	n *= 3;
    }
};

for_each(v.begin(), v.end(), Multi3());

 

5. 데이터 삭제 - remove / remove_if

        {
            for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
            {
                if((*it) % 2 != 0)
                    it = v.erase(it);
            }
        }

위의 알고리즘과는 조금 다르게 작동한다.

find_if를 통해 조건을 만족하는 요소를 가리킨다.

그리고 조건에 부합하지 않는(삭제하지 않으려 하는)데이터를 빈 칸으로 하나씩 당겨온다.

그리고 반복자가 삭제해야 되는 요소의 위치를 가리키게 한다.

즉 데이터를 실제로 제거하는 것이 아닌 필요한 부분만 앞으로 꺼내고 쓰레기 값의 처음을 가리키게 하는 것이므로,

필요한 부분만 추출할 것이라면, it부터 v.end()까지 erase하게 하면 된다.

v.erase(remove_if(v.begin(), v.end(), IsOdd()), v.end());

 

6. 알고리즘 기능 보기

http://cppreference.com

'기초 C++ 스터디 > STL' 카테고리의 다른 글

9-8. STL - Set, Multimap, Multiset  (0) 2023.06.19
9-7. STL - Map  (0) 2023.06.15
9-6. STL - Deque  (0) 2023.06.15
9-5. STL - List (2)  (0) 2023.06.14
9-4. STL - List (1)  (0) 2023.06.14