프로그래밍/C++

STL algorithm

우대비 2022. 11. 8. 20:10
반응형

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