ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • _C++_컨테이너 어댑터와 비트셋 컨테이너
    Programming/_C++ 2023. 9. 20. 19:09

    컨테이너 어댑터

    컨테이너 어댑터는 순차 컨테이너를 바탕으로 인터페이스를 다르게 래핑한 것을 말한다.

    컨테이너 어댑터의 목적은 보다 단순화된 인터페이스를 제공하는 것이다.

    기본적으로 다음 세 가지가 있다.

    • queue
    • priority_queue
    • stack

    1. queue

     queue는 헤더에 정의된 표준적인 선입선출(FIFO) 시멘틱을 구현한다.

    다음과 같은 템플릿 정의를 갖는다.

    template <typename _Ty, typename _Container = deque<_Ty>> class queue;

    deque 컨테이너를 기본 값으로 가지고 있으며, list도 사용할 수 있다.

    queue는 다음과 같이 생성할 수 있다.

    #include <queue>
    #include <deque>
    #include <list>
    using namespace std;
    
    int main(){
        queue<int> q1; // 일반적인 생성방법.
        
        // deque를 참조한 생성
        deque<int> dq{ 1, 2, 3, 4, 5 };
        queue<int> q2{ dq };
        
        // list를 참조한 생성
        list<int> lst{ 1, 2, 3, 4, 5 };
        queue<int, list<int>> q3{ lst }; // 두번째 파라미터가 기본적으로 deque이기 때문에 list로 지정
        return 0;
    }

    다음의 method를 사용할 수 있다.

    // look up
    front() // 첫 번째 항목 리턴
    back()  // 마지막 항목 리턴
    
    // insert
    push()    // 인자를 받아 마지막 항목에 추가
    emplace() // 항목 타입의 생성자 인수 목록을 전달하여 메서드 내부에서 항목 타입의 객체를 생성 마지막 항목으로 추가.
    
    // delete
    pop() // 첫 번째 항목 제거

     

    2. priority_queue

     우선순위 큐는 우선순위가 높은 항목이 가장 앞에 오도록 하는 큐이다.

    다음과 같은 템플릿 정의를 갖는다.

    template <typename _Ty, typename _Container = vector<_Ty>, typename _Pr = less<_Ty>>

    vector 컨테이너를 기본 값으로 가지고 있으며 deque를 사용할 수 있다.

    세 번째 파라미터는 우선순위의 비교에 사용될 비교 연산을 나타내는 타입이다.

    less<>는 operator<를 기준으로 비교해주고 작은 쪽이 더 낮은 우선순위를 갖는다.

    반대로 greater<>는 operator>를 기준으로 비교해주고 작은 쪽이 더 높은 우선순위를 갖는다.

     

    priority_queue는 queue 인터페이스와 유사하지만 front(), back()을 지원하지 않고 top()으로 look up을 한다.

    priority_queue의 구현은 일반적으로 힙 구조이다.

     

    3. stack

    stack은 헤더에 정의되어 있고 선입후출(FILO) 시멘틱을 구현한다.

    다음과 같은 템플릿 정의를 갖는다.

    template <typename_Ty, typename _Container = deque<_Ty>> class stack;

    deque 컨테이너를 기본 값으로 가지고 있으며 끝에서 삽입 및 삭제가 발생하기 때문에 vector, list, deque 모두 사용 가능하다.

    인터페이스는 priority_queue와 같다.


    비트셋 컨테이너

    비트셋 컨테이너는 특수한 컨테이너로 비트별로 on/off 상태를 저장 및 관리한다.

    bool이 1byte를 차지하는 것과 달리 비트셋에서 각 비트는 1bit크기만 차지한다.

    operator[] 등으로 접근하면 bool type의 proxy 객체를 리턴해준다.

    bitset으로 0과 1로 이루어진 string으로부터 생성될 수 있고 비트 연산자로 집합 연산을 할 수  있다.

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    int main(){
        bitset<10> bs;
        bs.set(3);
        cout << bs << "\n"; // 0000001000
        bs.set(6);
        cout << bs << "\n"; // 0001001000
        bs[8] = true; // operator[]를 이용한 비트 쓰기
        cout << bs << "\n"; // 0101001000
        bs[9] = bs[3]; // operator[]를 이용한 비트 읽기
        cout << bs << "\n"; // 1101001000
        if (bs.test(3)) //bs[3] == true
            cout << "Bit 3 is set!" << endl;
        cout << bs << endl; //1101001000
    
        auto str1 = "0011001100";
        auto str2 = "0000111100";
        bitset<10> bits1(str1);
        bitset<10> bits2(str2);
        auto bits3 = bits1 & bits2; // And 연산
        cout << bits3 << endl; //0000001100
        bits3 <<= 4; // 4칸씩 왼쪽으로 shift
        cout << bits3 << endl; //0011000000
    
        return 0;
    }

     

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

    _C++_알고리즘_Part_2  (0) 2023.09.25
    _C++_Template  (1) 2023.09.24
    _C++_lambda  (0) 2023.09.20
    _C++_Scope  (0) 2023.09.20
    _C++_알고리즘_Part_1  (0) 2023.09.19
Designed by Tistory.