전체 코드

🚀 1. 개요

이 코드는 C++ STL알고리즘(algorithm) 라이브러리를 활용하여 데이터를 다루는 여러 방법을 실습합니다.
다음과 같은 알고리즘을 구현하며, STL이 제공하는 유용한 함수들을 배울 수 있습니다.

  1. find / find_if - 특정 값을 찾거나 조건에 맞는 값을 찾기
  2. count / count_if - 특정 값 또는 조건에 맞는 개수 세기
  3. all_of / any_of / none_of - 모든 데이터가 조건을 만족하는지 확인
  4. for_each - 모든 데이터 순회하며 작업 수행
  5. remove / remove_if - 특정 값이나 조건에 맞는 데이터를 삭제

📂 2. 코드 분석

🔹 헤더 파일 포함 및 함수 선언

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

헤더 파일 설명

  • #include <iostream> → 표준 입출력(cin, cout)
  • #include <vector> → 동적 배열(vector)
  • #include <algorithm>find, count, for_each, remove 등의 알고리즘 사용

🎯 main 함수 시작

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

    vector<int> v;

    int number = 50;

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

자료구조와 알고리즘

  • 자료구조는 데이터를 저장하는 구조 (ex. vector)
  • 알고리즘은 저장된 데이터를 활용하는 방법

vector<int> v; → 정수형 vector 선언
for 루프0 ~ 99까지 값을 추가


🔹 1. 특정 값(50) 찾기 - find

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

std::find(v.begin(), v.end(), number)

  • v.begin() ~ v.end() 사이에서 number(50)을 찾음
  • 반환값: 찾으면 해당 위치의 iterator 반환, 못 찾으면 v.end() 반환

🔹 2. 특정 조건(11의 배수)을 만족하는 값 찾기 - 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;
    }

std::find_if(v.begin(), v.end(), 조건객체)

  • CanDivideBy11 함수 객체를 사용하여 11의 배수 찾기
  • 찾으면 해당 iterator 반환, 못 찾으면 v.end()

람다 함수 버전

vector<int>::iterator itFind = find_if(v.begin(), v.end(), [](int n) { return n % 11 == 0; });
  • 위와 동일한 동작을 람다 함수([]() {})로 구현 가능

🔹 3. 특정 조건(홀수)의 개수 세기 - 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;
    }

std::count_if(v.begin(), v.end(), 조건객체)

  • 조건(홀수)을 만족하는 요소의 개수를 반환

람다 함수 버전

int count = count_if(v.begin(), v.end(), [](int n) { return n % 2 != 0; });

🔹 4. 모든 데이터 조건 검사 - 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;

조건에 따라 true / false 반환

  • all_of → 모든 요소가 조건을 만족하는지 확인
  • any_of → 하나라도 조건을 만족하면 true
  • none_of → 모든 요소가 조건을 만족하지 않으면 true

람다 함수 버전

bool allOdd = all_of(v.begin(), v.end(), [](int n) { return n % 2 != 0; });
bool anyOdd = any_of(v.begin(), v.end(), [](int n) { return n % 2 != 0; });
bool noneOdd = none_of(v.begin(), v.end(), [](int n) { return n % 2 != 0; });

🔹 5. 모든 요소 3배 증가 - for_each

    // for_each
    // 모든 데이터를 스캔할 때
    {
        struct MultiplyBy3 {
            void operator()(int& n) {
                n *= 3;
                cout << n << endl;
            }
        };

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

std::for_each(v.begin(), v.end(), 조건객체)

  • 벡터의 모든 요소를 순회하며 각 요소를 3배로 증가

람다 함수 버전

for_each(v.begin(), v.end(), [](int& n) { n *= 3; cout << n << endl; });

🔹 6. 특정 요소 삭제 - 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());
    }

std::remove_if(v.begin(), v.end(), 조건객체)

  • 삭제 대상이 아닌 요소를 앞으로 이동하여 새로운 범위를 생성
  • 실제 삭제는 erase(it, v.end())로 수행해야 함!

람다 함수 버전

v.erase(remove_if(v.begin(), v.end(), [](int n) { return n % 2 != 0; }), v.end());

profile
李家네_공부방

0개의 댓글