컨테이너 어댑터(container adapter)란 기존 컨테이너의 인터페이스를 제한하여 만든 기능이 제한되거나 변형된 컨테이너를 의미합니다.
이러한 컨테이너 어댑터는 각각의 기초가 되는 클래스의 인터페이스를 제한하여, 특정 형태의 동작만을 수행하도록 합니다.
std::stack
std::queue
std::priority_queue
어뎁터는 std::deque, std::vector 와 같은 컨테이너를 사용하여 구성한다.
stack구현을 위해서는 벡터가 아니라 덱을 기본 컨테이너로 사용한다.
-> 원소 저장 공간을 재할 당 할때 벡터처럼 전체를 다 옮길 필요가 없다.
std::queue는 FIFO을 지원한다.
std::stack은 LIFO임.
std::queue는 std::deque를 기본 컨테이너로 사용한다.
우선순위 큐는 힙이라고 부르는 매우 유용한 구조를 제공한다.
힙(Heap)이란?
컨테이너에서 가장 작은(또는 가장 큰) 원소에 빠르게 접근할 수 있는 자료구조이다.
최소/최대에 access하는 time complex는 O(1)이다.
삽입의 경우O(log n)을 가진다.
그리고 원소 제거는 최소/최대에 대해서만 가능하다.
주의할점 ❗❗
최대와 최소에 한꺼번에 접근할 수 는 없다.
둘중하나에 대해서만 적용이 가능하다.
최대 최소 접근 결정은 "비교자"를 통해 한다.
std::less라는 비교자를 기본적으로 사용한다.
std::stack, std::queue는 std::deque를 기본 컨테이너로 사용하지만
std::priority_queue는 std::vector를 기본 컨테이너로 사용하고 이는 변경할 수 있다.
스택, 큐, 우선순위 큐 는 모든 원소를 순회할 필요가 없다.
언제든 특정 위치에 있는 원소 하나만 참조 할 수 있으면 되기 때문에 STL은 iterator를 제공하지 않는다.
#include <iostream>
#include <queue>
class Job
{
int id;
std::string user;
int pages;
static int count;
public:
Job(const std::string& u, int p) : user(u), pages(p), id(++count) {}
friend std::ostream& operator<<(std::ostream& os, const Job& j)
{
os << "id: " << j.id << ", 사용자: " << j.user << ", 페이지수: " << j.pages << "장";
return os;
}
};
int Job::count = 0;
template <size_t N>
class Printer
{
std::queue<Job> jobs;
public:
bool addNewJob(const Job& job)
{
if (jobs.size() == N)
{
std::cout << "인쇄 대기열에 추가 실패: " << job << std::endl;
return false;
}
std::cout << "인쇄 대기열에 추가: " << job << std::endl;
jobs.push(job);
return true;
}
void startPrinting()
{
while (not jobs.empty())
{
std::cout << "인쇄 중: " << jobs.front() << std::endl;
jobs.pop();
}
}
};
int main()
{
Printer<5> printer;
Job j1("광희", 10);
Job j2("정다", 4);
Job j3("현수", 5);
Job j4("유미", 7);
Job j5("채원", 8);
Job j6("시원", 10);
printer.addNewJob(j1);
printer.addNewJob(j2);
printer.addNewJob(j3);
printer.addNewJob(j4);
printer.addNewJob(j5);
printer.addNewJob(j6); // 인쇄 대기열이 가득 차있어서 추가할 수 없음
printer.startPrinting();
printer.addNewJob(j6); // 인쇄 대기열이 비었으므로 추가 가능
printer.startPrinting();
}