STL 용기 어댑터 quue 구현 프레임 워 크
이전 글 에서 STL 의 용기 어댑터 stack 의 실현 프레임 워 크 는 STL 이 기초 용 기 를 통 해 자주 사용 하 는 데이터 구조 stack (스 택) 을 어떻게 실현 하 는 지 소개 했다. 본 고 는 다른 STL 내부 에서 정의 하 는 또 다른 STL 용기 어댑터 quue (대기 열) 를 소개 한다.
데이터 구 조 를 접 한 사람 에 게 대기 열 은 낯 설 지 않 습 니 다. FIFO (first in first out) 의 데이터 구조 입 니 다. 스 택 에 비해 대기 열의 차이 점 은 다음 과 같 습 니 다. (1) 대기 열 은 선진 적 으로 먼저 나 온 데이터 구조 이 고 스 택 은 후진 적 으로 먼저 나 오 는 수치 구조 입 니 다. (2) 대기 열 은 앞 뒤 양쪽 의 방문 작업 을 지원 하 며 스 택 은 한 끝 (즉 정상) 만 지원 합 니 다.스 택 의 삽입 과 팝 업 은 스 택 꼭대기 에 있 습 니 다. 물론 용기 어댑터 quue 와 stack 은 옮 겨 다 니 는 작업 을 지원 하지 않 고 내부 에 교체 기 를 제공 하지 않 는 다 는 공통점 이 있 습 니 다.
위의 비교 에서 우 리 는 이 두 어댑터 가 기초 용기 에 대한 요구 가 다르다 는 것 을 추측 할 수 있다. 위 에서 언급 한 제 (3) 점 과 같다. queue 의 기초 용 기 는 첫 번 째 에서 튀 어 나 올 수 있 도록 지원 해 야 하고 stack 의 기초 용 기 는 꼬리 에서 튀 어 나 올 수 있 도록 지원 해 야 한다. 다시 말 하면 queue 의 기초 용 기 는 pop front () 를 지원 해 야 한다.작업, stack 의 기본 용 기 는 pop back () 작업 을 지원 해 야 합 니 다. 이 때문에 순서 용기 vector, list, deque 는 stack 의 기본 용기 로 사용 할 수 있 으 며, list 와 deque 는 quue 의 기본 용기 로 사용 할 수 있 으 며, vector 는 quue 의 기본 용기 (vector) 로 서 pop front () 작업 을 제공 하지 않 습 니 다. 이 두 어댑터 의 기본 기본 용 기 는 모두 deque 입 니 다.
stack 과 quue 작업 의 차이 에 따라 stack 과 quue 가 제공 하 는 작업 의 차 이 를 비교 분석 할 수 있 습 니 다.
quue 가 제공 하 는 동작 은 다음 과 같 습 니 다.
(1) 현재 대기 열 에 있 는 요소 의 개 수 를 가 져 옵 니 다. size type size (), stack 도 이 동작 을 제공 합 니 다.
(2) 팀 의 첫 번 째 요 소 를 가 져 옵 니 다 (팝 업 하지 않 음). T & front (), stack 은 이 동작 을 제공 하지 않 습 니 다.
(3) 팀 의 꼬리 요 소 를 가 져 옵 니 다 (팝 업 하지 않 음). T & back (), stack 에 대응 하 는 함 수 는 T & top () 입 니 다.
(4) 입단 작업. void push (const T & t), stack 도 같은 함 수 를 제공 하여 스 택 작업 에 대응 합 니 다.
(5) 파티 작업. void pop (), stack 도 같은 함 수 를 제공 하여 스 택 작업 에 대응 합 니 다.
(6) 대기 열 이 비어 있 는 지 판단 합 니 다. bool empty (), stack 도 같은 함 수 를 제공 합 니 다.
STL 에서 정의 하 는 quue 어댑터 를 사용 하려 면 quue 헤더 파일 을 참조 해 야 합 니 다. \ # include < quue >.
다음은 quue 어댑터 의 실현 코드 와 테스트 코드 를 드 립 니 다.
#include<iostream>
#include<deque>
using namespace std;
/****************queque *************/
template<class T,class Sequence=deque<T> >
class queue
{
friend bool operator==(const queue& x,const queue& y);
friend bool operator<(const queue&x,const queue& y);
/**************** queue *********************/
public:
typedef typename Sequence::value_type value_type;//
typedef typename Sequence::size_type size_type;//
typedef typename Sequence::reference reference;//
typedef typename Sequence::const_reference const_reference;//
protected:
Sequence c;//
/*************queue ****************/
public:
bool empty()const;//
size_type size()const;//
reference front();//
const_reference front()const;
reference back();//
const_reference back()const ;
void push(const value_type& x);//
void pop();//
};
/***************queue ***************/
template<class T,class Seq>
bool queue<T,Seq>::empty()const// ,const
{
return c.empty();
}
template<class T,class Seq>
typename queue<T,Seq>::size_type queue<T,Seq>::size()const//
{
return c.size();
}
template<class T,class Seq>
typename queue<T,Seq>::reference queue<T,Seq>::front()//
{
return c.front();
}
template<class T,class Seq>
typename queue<T,Seq>::const_reference queue<T,Seq>::front()const//
{
return c.front();
}
template<class T,class Seq>
typename queue<T,Seq>::reference queue<T,Seq>::back()//
{
return c.back();
}
template<class T,class Seq>
typename queue<T,Seq>::const_reference queue<T,Seq>::back()const//
{
return c.back();
}
template<class T,class Seq>
void queue<T,Seq>::push(const value_type& t)//
{
c.push_back(t);
}
template<class T,class Seq>
void queue<T,Seq>::pop()//
{
c.pop_front();
}
int main()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while(!q.empty())
{
cout<<"size="<<q.size()<<" ";
cout<<q.front()<<endl;
q.pop();
}
return 0;
}
참고 자료
[1] 《 STL 소스 분석 후 첩 》
[2] 'C + + Primer 4 판'
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.