Container Adaptor

CJB_ny·2022년 11월 7일
0

DataStructure & Algorithm

목록 보기
8/35
post-thumbnail

Container Adaptor란?

컨테이너 어댑터(container adapter)란 기존 컨테이너의 인터페이스를 제한하여 만든 기능이 제한되거나 변형된 컨테이너를 의미합니다.

이러한 컨테이너 어댑터는 각각의 기초가 되는 클래스의 인터페이스를 제한하여, 특정 형태의 동작만을 수행하도록 합니다.

종류

  • std::stack

  • std::queue

  • std::priority_queue

std::stack

어뎁터는 std::deque, std::vector 와 같은 컨테이너를 사용하여 구성한다.

stack구현을 위해서는 벡터가 아니라 덱을 기본 컨테이너로 사용한다.

-> 원소 저장 공간을 재할 당 할때 벡터처럼 전체를 다 옮길 필요가 없다.

std::queue

std::queue는 FIFO을 지원한다.

std::stack은 LIFO임.

std::queue는 std::deque를 기본 컨테이너로 사용한다.

std::priority_queue

우선순위 큐는 힙이라고 부르는 매우 유용한 구조를 제공한다.

힙(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();
}
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글