이 코드는 C++ STL의 알고리즘(algorithm) 라이브러리를 활용하여 데이터를 다루는 여러 방법을 실습합니다.
다음과 같은 알고리즘을 구현하며, STL이 제공하는 유용한 함수들을 배울 수 있습니다.
find / find_if - 특정 값을 찾거나 조건에 맞는 값을 찾기count / count_if - 특정 값 또는 조건에 맞는 개수 세기all_of / any_of / none_of - 모든 데이터가 조건을 만족하는지 확인for_each - 모든 데이터 순회하며 작업 수행remove / remove_if - 특정 값이나 조건에 맞는 데이터를 삭제#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);
}
✅ 자료구조와 알고리즘
vector)✅ vector<int> v; → 정수형 vector 선언
✅ for 루프 → 0 ~ 99까지 값을 추가
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() 반환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; });
[]() {})로 구현 가능홀수)의 개수 세기 - 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; });
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 → 하나라도 조건을 만족하면 truenone_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; });
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(), 조건객체)
✅ 람다 함수 버전
for_each(v.begin(), v.end(), [](int& n) { n *= 3; cout << n << endl; });
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());