queue概述
queue是一种先进先出(First In First Out, FIFO),它有两个入口,但只允许在一个入口(队尾)添加元素,在另一个入口(队头)获取和删除元素
queue不允许有遍历行为,所以不提供迭代器
queue
通常使用deque来作为queue的底层实现,这种修改接口的方法被称为适配器模式
因此queue往往不归类为container(容器),而被归类为container adapter(容器适配器)
STL的实现中,可以通过模板参数修改queue的底层容器
queue实现
queue的实现非常简单,完全调用底层容器的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| template <typename T, typename Container = Deque<T>> class Queue { public: using container_type = Container; using value_type = typename Container::value_type; using size_type = typename Container::size_type; using reference = typename Container::reference; using const_reference = typename Container::const_reference;
template <typename T_, typename Container_> friend bool operator==(const Queue<T_, Container_>& lhs, const Queue<T_, Container_>& rhs); template <typename T_, typename Container_> friend bool operator<(const Queue<T_, Container_>& lhs, const Queue<T_, Container_>& rhs);
Queue() = default; explicit Queue(const Container& c) : c_(c) {} explicit Queue(Container&& c) : c_(std::move(c)) {} template <typename InputIt, typename Category = typename std::iterator_traits<InputIt>::iterator_category> Queue(InputIt first, InputIt last) : c_(first, last) {} ~Queue() = default;
reference front() { return c_.front(); } const_reference front() const { return c_.front(); } reference back() { return c_.back(); } const_reference back() const { return c_.back(); }
bool empty() const { return c_.empty(); } size_type size() const { return c_.size(); }
void push(const T& v) { c_.push_back(v); } void push(T&& v) { c_.push_back(std::move(v)); } template <typename... Args> void emplace(Args&&... args) { c_.emplace_back(std::forward<Args>(args)...); } template <typename InputIt, typename Category = typename std::iterator_traits<InputIt>::iterator_category> void push(InputIt first, InputIt last) { for (; first != last; ++first) { emplace(*first); } } void pop() { c_.pop_front(); } void swap(Queue& other) { std::swap(c_, other.c_); }
private: Container c_; };
|
参考
Last updated: