ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [c++] std::stable_partition
    Programming/c++ 2022. 12. 24. 18:40
    728x90

    1.함수 헤더 파일

    #include <algorithm>

     

    2.함수 원형

    template<class BidirectionalIterator, class UnaryPredicate>
    BidirectionalIterator stable_partition(
        BidirectionalIterator first,
        BidirectionalIterator last,
        UnaryPredicate pred );
    
    template<class ExecutionPolicy, class BidirectionalIterator, class UnaryPredicate>
    BidirectionalIterator stable_partition(
        ExecutionPolicy&& exec,
        BidirectionalIterator first,
        BidirectionalIterator last,
        UnaryPredicate pred);

    참조된 범위는 유효해야 하고 모든 포인터는 역참조 가능해야 하며 시퀀스 내에서 처음 위치에서 증분하여 마지막 위치까지 도달할 수 있어야 합니다.

    pred는 사용자 정의 조건자 함수 개체입니다. 요소가 분류되어야 하는 경우 충족할 조건을 정의합니다. 조건자는 단일 인수를 사용하고 true or false를 반환합니다.

    인자로 지정한 vector의 요소의 위치가 변경되어 저장됩니다.

     stable_partitiond은 안정적이며 동등한 요소의 상대적 순서가 유지되도록 보장합니다. 시퀀스의 상대적 순서가 유지됨을 의미합니다. 알고리즘 partition은 원래 순서를 반드시 유지하지는 않습니다.

     

    쉽게 설명하면,

    pred 사용자 정의 함수에 따라 part 1, part 2로 part를 나눕니다.

    나뉘어 지는 위치의 반복자를 리턴하는 함수입니다.

    3.return 값(반환 값)

    조건자 조건을 충족하지 못하는 범위에서 첫 번째 요소 위치의 주소를 지정하는 양방향 반복기입니다.

     

    4.예제

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<int> v{ 6, 9, 0, 1, 2, 7, 5, 8, 0 };
        stable_partition(v.begin(), v.end(), [](int n) {return n>0; });
        for (int n : v) {
            cout << n << ' ';
        }
        cout << '\n';
    }
    //output
    6 9 1 2 7 5 8 0 0

    요소들의 순서는 보장하되 0은 맨 뒤로 이동시키는 예제입니다.

    part1 : 6, 9, 1, 7, 5, 8

    part2 : 0, 0

     

     

    bool odd(int i){  //홀수 판별
        return (i % 2) == 1;
    }
    
    int main(){
    
        std::vector<int> vec {1, 2, 3, 4, 5, 6, 7, 8, 9};
    
        std::vector<int>::iterator bound;
        bound = std::stable_partition(vec.begin(), vec.end(), odd);
        //1, 3, 5, 7, 9, 2, 4, 6, 8
    
        std::cout << "odd numbers : ";
        for(std::vector<int>::iterator it = vec.begin(); it != bound; ++it){
            std::cout << ' ' << *it;
        }
        std::cout << std::endl;
    
        std::cout << "even numbers : ";
        for(std::vector<int>::iterator it = bound; it != vec.end(); ++it){
            std::cout << ' ' << *it;
        }
        std::cout << std::endl;
    
        return 0;
    }
    odd numbers : 1 3 5 7 9
    even numbers: 2 4 6 8

    bound 반복자에 part1, part2나누어 지는 위치가 저장되어 있습니다.

    bound를 기준으로 odd, even 요소들을 구할 수 있습니다.

     

     

     

     

     

    728x90

    'Programming > c++' 카테고리의 다른 글

    [c++] regex 라이브러리  (0) 2023.01.20
    [c++] std::partition_point  (0) 2022.12.26
    [C++] 비트 연산, Bitwise ( 10진수를 2진수로 변환)  (1) 2022.12.13
    [VSCode] c++17 설정  (0) 2022.12.03
    [c++] Stable_sort() vs Sort() 함수 차이  (0) 2022.11.24

    댓글

© 2022. code-space ALL RIGHTS RESERVED.