반응형
std의 vector나 list같은 것들을
보다 편리하게 사용할 수 있게 C++에서 제공하는 내장 함수들이 있음
#include <algorithm>
algorithm의 대표적인 함수들에 대해 알아보게씀
-find
int number = 50;
vector<int>::iterator itFind = find(v.begin(), v.end(), number);
if (itFind == v.end())
{
cout << "못찾음" << endl;
}
else
cout << "찾음" << endl;
auto itFind2 = find(v.begin(), v.end(), number); // auto == vector<int>::iterator
begin ~ end 사이에 number 값을 가지고 있는 위치를 찾아냄
-find_if
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;
auto itFind2 = find_if(v.begin(), v.end(), [](int n) { return n % 11 == 0;});
함수를 넣어서 해당 함수의 조건에 해당하는 위치를 찾음 ( 람다식도 가능 )
-count_if
struct IsOdd
{
bool operator() (int n)
{
return (n % 2) != 0;
}
};
// 홀수인 데이터는 모두 몇개입니까?
int n = count_if(v.begin(), v.end(), IsOdd());
-all_of
// 모든 데이터가 홀수입니까?
bool b1 = std::all_of(v.begin(), v.end(), IsOdd());
-any_of
// 홀수인 데이터가 하나라도 있습니까?
bool b2 = std::any_of(v.begin(), v.end(), IsOdd());
-none_of
// 모든 데이터가 홀수가 아닙니까?
bool b3 = std::none_of(v.begin(), v.end(), IsOdd());
-for_each
struct MultiplyBy3
{
void operator()(int& n)
{
n = n * 3;
}
};
for_each(v.begin(), v.end(), MultiplyBy3());
모든 데이터를 MultiplyBy3 함수객체에 넣음
-remove
remove(v.begin(), v.end(), 4);
값이 4인 데이터 삭제
⁜ remove_if ⁜
struct IsOdd2
{
bool operator() (int n)
{
return (n % 2) != 0;
}
};
vector<int>::iterator it = remove_if(v.begin(), v.end(), IsOdd2()); // 필요없는 위치를 반환
v.erase(it, v.end());
// -> 완전히 같음
v.erase(remove_if(v.begin(), v.end(), IsOdd2()), v.end());
remove_if는 IsOdd2의 조건에 해당하는 데이터를 삭제하는거라고 생각 할 수 있지만
사실 그렇지 않음
1,4,3,5,8,2의 데이터가 있을때의 remove_if
1. 1은 삭제 조건에 해당하므로 패스
2. 4는 삭제 조건에 해당하지 않으므로 남겨 둬야함 따라서 첫 번째 위치에 데이터를 복사함
3. 3은 삭제 조건에 해당하므로 패스
4. 5도 삭제 조건에 해당하므로 패스
5. 8은 삭제 조건에 해당하지 않으므로 남겨 둬야함 따라서 두 번째 위치에 데이터를 복사함
6. 2는 삭제 조건에 해당하지 않으므로 남겨 둬야함 다라서 세 번째 위치에 데이터를 복사함
- vector안의 데이터 = 4,8,2,5,8,2
이후 remove_if가 종료되고 iterator를 반환하는데 그 iterator는 5를 가르킴
즉 삭제되어야하는 위치를 반환하는거
vector<int>::iterator it = remove_if(v.begin(), v.end(), IsOdd2()); // 필요없는 위치를 반환
v.erase(it, v.end());
// -> 완전히 같음
v.erase(remove_if(v.begin(), v.end(), IsOdd2()), v.end());
따라서 그 위치부터 vector의 끝까지 다시한번 제거해줘야함
반응형
LIST
'프로그래밍 > C++' 카테고리의 다른 글
using, typedef (1) | 2022.11.09 |
---|---|
중괄호 초기화와 initializer_list (0) | 2022.11.08 |
STL set, multi(map, set) (0) | 2022.11.07 |
STL map (0) | 2022.11.06 |
STL deque 정리 (1) | 2022.11.04 |