전체 코드


📌 1. 개요

이 코드는 C++의 <algorithm> 라이브러리를 활용하여 데이터 탐색, 조건 검색, 데이터 변환 및 삭제 등의 다양한 알고리즘을 실습하는 예제입니다.

  1. find() - 특정 값을 벡터에서 찾기
  2. find_if() - 조건을 만족하는 첫 번째 값 찾기
  3. count_if() - 조건을 만족하는 개수 찾기
  4. all_of() / any_of() / none_of() - 데이터 조건 확인
  5. for_each() - 모든 요소에 대한 연산 수행
  6. remove_if() - 조건을 만족하는 데이터 삭제

이러한 알고리즘을 사용하면 효율적인 데이터 처리 및 코드 가독성을 향상시킬 수 있습니다.


📂 2. 코드 분석

🔹 헤더 파일 및 초기 설정

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

헤더 파일 설명

  • #include <iostream> → 콘솔 입출력 사용
  • #include <vector> → 동적 배열 STL 활용
  • #include <algorithm> → 알고리즘 라이브러리 사용
void PrintFunc(int n) {
    cout << n << endl;
}

출력 함수 정의

  • for_each()에서 사용할 간단한 출력 함수

🔹 1. main 함수 시작

int main()
{
    // 자료구조 (데이터를 저장하는 구조)
    // 알고리즘 (저장한 데이터를 어떻게 사용할 것인가?)

    vector<int> v;
    int number = 50;

    for (int i = 0; i < 100; i++) {
        v.push_back(i);
    }

벡터 v를 0~99까지 초기화

  • vector<int> v; → 정수형 벡터 선언
  • v.push_back(i);0부터 99까지 값 추가

🔹 2. find() - 특정 값 찾기

    // find
    // (시작 주소, 끝 주소 + 1, 찾을 대상)
    {
        vector<int>::iterator itFind = find(v.begin(), v.end(), number);
        if (itFind == v.end()) cout << "못 찾음" << endl;
        else cout << "찾음" << endl;
    }

특정 값(50)이 벡터에 있는지 확인

  • find(v.begin(), v.end(), number)50을 찾음
  • 찾았으면 "찾음" 출력, 없으면 "못 찾음" 출력

🔹 3. find_if() - 조건을 만족하는 값 찾기

    // find_if
    // (시작 주소, 끝 주소 + 1, 조건식)
    {
        struct CanDivideBy11 {
            bool operator()(int n) {
                return n % 11 == 0;
            }
        };

        vector<int>::iterator itFind = find_if(v.begin(), v.end(), CanDivideBy11());
        if (itFind == v.end()) cout << "못 찾음" << endl;
        else cout << "찾음" << endl;
    }

11로 나누어 떨어지는 첫 번째 값 찾기

  • find_if()조건을 만족하는 첫 번째 값을 반환
  • 구조체 CanDivideBy11을 활용하여 n % 11 == 0인 값 찾기

🔹 4. count_if() - 특정 조건을 만족하는 개수 찾기

    // count_if
    // (시작 주소, 끝 주소 + 1, 조건문)
    {
        struct IsOdd {
            bool operator()(int n) {
                return n % 2 != 0;
            }
        };

        int count = count_if(v.begin(), v.end(), IsOdd());
        cout << count << endl;

홀수 개수 찾기

  • count_if()를 사용하여 IsOdd() 조건을 만족하는 개수 계산

🔹 5. 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());

        cout << "b1 : " << b1 << ", b2 : " << b2 << ", b3 : " << b3 << endl;
    }

모든 요소가 특정 조건을 만족하는지 검사

  • all_of()모든 요소가 조건을 만족하면 true
  • any_of()하나라도 조건 만족 시 true
  • none_of()조건을 만족하는 요소가 없으면 true

🔹 6. for_each() - 모든 요소에 연산 적용

    // for_each
    // 모든 데이터를 스캔할 때
    // (시작 주소, 끝 주소 + 1, 조건문)
    {
        struct MultiplyBy3 {
            void operator()(int& n) {
                n *= 3;
                cout << n << endl;
            }
        };

        for_each(v.begin(), v.end(), MultiplyBy3());
    }

벡터의 모든 요소를 3배 증가

  • for_each()를 활용하여 MultiplyBy3() 함수 실행

🔹 7. remove_if() - 특정 조건을 만족하는 데이터 삭제

    // remove
    // remove_if
    {
        v.clear();

        v.push_back(1);
        v.push_back(4);
        v.push_back(3);
        v.push_back(5);
        v.push_back(8);
        v.push_back(2);

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

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

벡터에서 홀수 삭제

  • remove_if()삭제할 값들을 벡터 뒤쪽으로 이동
  • erase()를 사용해 실제로 제거

profile
李家네_공부방

0개의 댓글