이전 예제 실습에서 구현한 코드를 알고리즘을 이용하여 간단하게 구현할 수 있다.
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. 알고리즘 기능 보기
'기초 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 |