-
_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 (1) 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