이 예제 코드와 주석을 상세히 분석하고 설명하겠습니다.
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
#include <iostream>: C++ 표준 입출력 라이브러리입니다. cout을 사용하기 위해 포함합니다.#include <deque>: 표준 C++ 라이브러리의 deque 컨테이너를 사용하기 위해 포함합니다.#include <algorithm>: push_heap 및 pop_heap과 같은 알고리즘 함수를 사용하기 위해 포함합니다.using namespace std;: std 네임스페이스를 사용하여 cout, deque 등을 간편하게 사용할 수 있게 합니다.class Shape
{
};
class Shape: Shape라는 빈 클래스를 정의합니다. 이 클래스는 나중에 확장될 수 있지만 현재는 기능이 없습니다.class Rectangle : public Shape
{
};
class Rectangle : public Shape: Shape 클래스를 상속받아 Rectangle 클래스를 정의합니다. Rectangle은 Shape의 모든 멤버를 public으로 상속받습니다. 현재 Rectangle 클래스는 아무 멤버도 추가하지 않은 상태입니다.설명:
Rectangle 클래스는 Shape와 is-a 관계입니다. 즉, Rectangle은 Shape의 한 종류입니다.class Queue0
{
private:
// private 상속대신에 멤버변수로 가지고 있는것이 좋다.
deque<int> v;
public:
void push(int value)
{
v.push_back(value);
}
void pop()
{
v.pop_front();
}
int top()
{
return v.front();
}
};
class Queue0: Queue0 클래스는 deque<int>를 멤버 변수로 사용합니다. deque의 기능을 Queue0 클래스에서 관리합니다.deque<int> v;: deque 객체 v를 private 멤버 변수로 선언합니다.void push(int value): deque의 push_back을 호출해 큐에 요소를 추가합니다.void pop(): deque의 pop_front를 호출해 큐의 첫 요소를 제거합니다.int top(): deque의 front를 호출해 큐의 첫 요소를 반환합니다.설명:
Queue0 클래스는 deque를 멤버 변수로 가지며, 큐의 기능을 구현합니다. 이는 deque를 상속받기보다는 포함하는 방식으로, 상속 대신 멤버 변수로 사용하는 것이 더 적합합니다.class Queue1 : private deque<int>
{
public:
void push(int value)
{
push_back(value);
}
void pop()
{
pop_front();
}
int top()
{
return front();
}
};
class Queue1 : private deque<int>: Queue1 클래스는 deque<int>를 private 상속합니다.void push(int value): deque의 push_back을 호출해 큐에 요소를 추가합니다.void pop(): deque의 pop_front를 호출해 큐의 첫 요소를 제거합니다.int top(): deque의 front를 호출해 큐의 첫 요소를 반환합니다.설명:
Queue1 클래스는 deque<int>를 private 상속합니다. private 상속은 deque의 모든 멤버를 private으로 상속받기 때문에, 외부에서는 deque의 멤버에 접근할 수 없습니다. Queue1 클래스 내에서만 deque의 인터페이스를 사용할 수 있습니다.private 상속은 deque의 protected 멤버 함수에 접근할 필요가 있거나, 상속을 통해 구현을 숨기고 싶을 때 사용합니다. 일반적으로는 잘 사용되지 않습니다.class Queue2 : protected deque<int>
{
public:
virtual void push(int value)
{
push_back(value);
}
virtual void pop()
{
pop_front();
}
virtual int top()
{
return front();
}
virtual ~Queue2()
{
}
};
class Queue2 : protected deque<int>: Queue2 클래스는 deque<int>를 protected 상속합니다.virtual void push(int value): deque의 push_back을 호출해 큐에 요소를 추가합니다.virtual void pop(): deque의 pop_front를 호출해 큐의 첫 요소를 제거합니다.virtual int top(): deque의 front를 호출해 큐의 첫 요소를 반환합니다.virtual ~Queue2(): 가상 소멸자입니다. 상속받는 클래스가 안전하게 소멸할 수 있도록 합니다.설명:
Queue2 클래스는 deque<int>를 protected 상속합니다. protected 상속은 deque의 모든 멤버를 protected로 상속받아 자식 클래스에서 사용할 수 있도록 합니다.protected 상속은 deque의 인터페이스를 자식 클래스에까지 공개할 필요가 있을 때 사용합니다. 자식 클래스에서 deque의 기능을 확장하거나 사용할 경우 유용합니다.class PriorityQueue : public Queue2
{
public:
virtual void push(int value) override
{
Queue2::push(value);
push_heap(begin(), end());
}
virtual void pop() override
{
pop_heap(begin(), end());
Queue2::pop_back();
}
virtual int top() override
{
return front();
}
};
class PriorityQueue : public Queue2: Queue2 클래스를 상속받아 PriorityQueue 클래스를 정의합니다.virtual void push(int value) override: Queue2의 push를 호출하여 요소를 추가한 후, push_heap을 호출해 우선순위 큐의 성질을 유지합니다.virtual void pop() override: pop_heap을 호출해 최상위 요소를 이동한 후, Queue2의 pop_back을 호출해 마지막 요소를 제거합니다.virtual int top() override: front를 호출해 우선순위 큐의 최상위 요소를 반환합니다.설명:
PriorityQueue 클래스는 Queue2를 상속받아 우선순위 큐의 기능을 구현합니다. push_heap과 pop_heap 알고리즘을 사용하여 요소의 순서를 유지합니다.int main()
{
PriorityQueue pq;
pq.push(10);
pq.push(100);
pq.push(0);
cout << pq.top() << endl;
pq.pop();
cout << pq.top() << endl;
pq.pop();
cout << pq.top() << endl;
pq.pop();
}
PriorityQueue pq;: PriorityQueue 객체를 생성합니다.pq.push(10);: 10을 우선순위 큐에 추가합니다.pq.push(100);: 100을 우선순위 큐에 추가합니다.pq.push(0);: 0을 우선순위 큐에 추가합니다.cout << pq.top() << endl;: 최상위 요소를 출력합니다.pq.pop();: 최상위 요소를 제거합니다.Queue0: deque를 멤버 변수로 사용하여 큐의 기능을 구현합니다. 포함(has-a) 관계입니다.Queue1: deque를 private 상속하여 인터페이스를 숨깁니다. private 상속은 외부에서 deque의 멤버에 접근할 수 없습니다.Queue2: deque를 protected 상속하여 자식 클래스에서 사용할 수 있도록 합니다. protected 상속은 자식 클래스에 기능을 공개할 때 유용합니다.PriorityQueue: Queue2를 상속받아 우선순위 큐의 기능을 구현합니다. push_heap과 pop_heap을 사용하여 요소의 우선순위를 유지합니다.