본문 바로가기
카테고리 없음

[c++] [container adaptor] queue

by a little good developer 2021. 5. 31.

queue - FIFO

queue

template <class T, class Container = deque<T> > class queue;

표준 deque container가 아닌 다른 container 로 사용될 수 있습니다.
해당 container 는 아래 동작을 지원해야합니다.

  • empty
  • size
  • front
  • back
  • push_back
  • pop_front

Member types && Member Objects

#include <deque>

template <class T, class Container = std::deque<T> >
class queue {
  public:
    typedef Container                                  container_type;
    typedef typename Container::value_type             value_type;
    typedef typename Container::size_type              size_type;

  private:
    container_type C;
};

 

Member functions

explicit queue (const container_type& ctnr = container_type());
~queue();
queue& operator=( const queue& other );
explicit queue (const container_type& ctnr = container_type()) : C(ctnr) {}
queue( const queue& other ) : C(other.C) {
  *this = other;
}
~queue() {}
queue& operator=( const queue& other ) {
  this->C = other.C;
  return (*this);
}
bool empty() const;
size_type size() const;
value_type& front();
const value_type& front() const;
value_type& back();
const value_type& back() const;
void push (const value_type& val);
void pop();

push() 와 pop() 을 FIFO 에 맞게 push_back(), pop_front() 을 사용하여 구현합니다.

그림처럼 front() 는 처음 들어온 데이터를 의미하고, back() 은 마지막으로 들어온 데이터를 의미합니다.

      bool empty() const {
        return (C.empty());
      }

      size_type size() const {
        return (C.size());
      }

      value_type& front() {
        return (C.front());
      }
      const value_type& front() const {
        return (C.front());
      }

      value_type& back() {
        return (C.back());
      }
      const value_type& back() const {
        return (C.back());
      }

      void push (const value_type& val) {
        C.push_back(val);
      }
      void pop() {
        C.pop_front();
      }

Non-member function overloads

template <class T, class Container>
bool operator== (const queue<T,Container>& lhs, const queue<T,Container>& rhs);
template <class T, class Container>
bool operator!= (const queue<T,Container>& lhs, const queue<T,Container>& rhs);
template <class T, class Container>
bool operator<  (const queue<T,Container>& lhs, const queue<T,Container>& rhs);
template <class T, class Container>
bool operator<= (const queue<T,Container>& lhs, const queue<T,Container>& rhs);
template <class T, class Container>
bool operator>  (const queue<T,Container>& lhs, const queue<T,Container>& rhs);
template <class T, class Container>
bool operator>= (const queue<T,Container>& lhs, const queue<T,Container>& rhs);

queue 클래스 내부에 friend 키워드를 사용하여 private 으로 함수들의 선언합니다.

    private:
      template <class U, class V>
      friend bool operator== (const queue<U,V>& lhs, const queue<U,V>& rhs);
      template <class U, class V>
      friend bool operator!= (const queue<U,V>& lhs, const queue<U,V>& rhs);
      template <class U, class V>
      friend bool operator<  (const queue<U,V>& lhs, const queue<U,V>& rhs);
      template <class U, class V>
      friend bool operator<= (const queue<U,V>& lhs, const queue<U,V>& rhs);
      template <class U, class V>
      friend bool operator>  (const queue<U,V>& lhs, const queue<U,V>& rhs);
      template <class U, class V>
      friend bool operator>= (const queue<U,V>& lhs, const queue<U,V>& rhs);

queue 의 템플릿 인자로 들어오는 container 의 각 operator 들을 사용하여 구현합니다.

  template <class U, class V>
  bool operator== (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C == rhs.C);
  }
  template <class U, class V>
  bool operator!= (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C != rhs.C);
  }
  template <class U, class V>
  bool operator<  (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C < rhs.C);
  }
  template <class U, class V>
  bool operator<= (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C <= rhs.C);
  }
  template <class U, class V>
  bool operator>  (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C > rhs.C);
  }
  template <class U, class V>
  bool operator>= (const queue<U,V>& lhs, const queue<U,V>& rhs) {
    return (lhs.C >= rhs.C);
  }

참고
c++98 을 기준으로 구현했습니다.
코드 하이라이팅이 깨지는 문제에 대해 해결방법을 아시면 답변부탁드립니다!