Qt 中的 Stack 和 STL 中的 Stack

Posted 张三和李四的家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 中的 Stack 和 STL 中的 Stack相关的知识,希望对你有一定的参考价值。

令人吃惊的是,QStack 是通过继承 QVector 来实现的。

The QStack class is a template class that provides a stack.
QStack inherits from QVector. All of QVector’s functionality also applies to QStack.

template<class T>
class QStack : public QVector<T>

public:
    inline QStack() 
    inline ~QStack() 
    inline void swap(QStack<T> &other)  QVector<T>::swap(other);  // prevent QVector<->QStack swaps
    inline void push(const T &t)  QVector<T>::append(t); 
    T pop();
    T &top();
    const T &top() const;
;

template<class T>
inline T QStack<T>::pop()
 Q_ASSERT(!this->isEmpty()); T t = this->data()[this->size() -1];
  this->resize(this->size()-1); return t; 

还行吧,pop 只会将容器越来越小。不会造成vector中元素的大量移动。
而,SLT 中的 stack 是通过has-a 的方式,将 deque 作为一个成员变量,然后使用的。


//GCC2.95

template <class _Tp, class _Sequence = deque<_Tp> >//也可以使用其它容器作为 _Sequence 的参数,如果该容器可以实现 stack 中的成员函数,比如 List  或 vector
class stack 
public:
  typedef typename _Sequence::value_type      value_type;
  typedef typename _Sequence::size_type       size_type;
  typedef          _Sequence                  container_type;

  typedef typename _Sequence::reference       reference;
  typedef typename _Sequence::const_reference const_reference;
protected:
  _Sequence _M_c;
public:

  bool empty() const  return _M_c.empty(); 
  size_type size() const  return _M_c.size(); 
  reference top()  return _M_c.back(); 
  const_reference top() const  return _M_c.back(); 
  void push(const value_type& __x)  _M_c.push_back(__x); //在尾部添加一个元素
  void pop()  _M_c.pop_back(); //在尾部删除一个元素
;

有什么优劣呢?
欢迎评论留言(#^.^#)

而且,Qt 中的 queue 也和 STL 中的不同。

template <class T>
class QQueue : public QList<T>

public:
    inline QQueue() 
    inline ~QQueue() 
    inline void swap(QQueue<T> &other)  QList<T>::swap(other);  // prevent QList<->QQueue swaps
    inline void enqueue(const T &t)  QList<T>::append(t); 
    inline T dequeue()  return QList<T>::takeFirst(); 
    inline T &head()  return QList<T>::first(); 
    inline const T &head() const  return QList<T>::first(); 
;

The QQueue class is a generic container that provides a queue.
QQueue inherits from QList. All of QList’s functionality also applies to QQueue.

template <class T, class _Sequence = deque<T> >//也可以使用其它容器作为 _Sequence 的参数,如果该容器可以实现 queue 中的成员函数。 ,比如 List
class queue 
public:
  typedef typename _Sequence::value_type      value_type;
  typedef typename _Sequence::size_type       size_type;
  typedef          _Sequence                  container_type;

  typedef typename _Sequence::reference       reference;
  typedef typename _Sequence::const_reference const_reference;
protected:
  _Sequence c;
public:

  bool empty() const  return c.empty(); 
  size_type size() const  return c.size(); 
  reference front()  return c.front(); 
  const_reference front() const  return c.front(); 
  reference back()  return c.back(); 
  const_reference back() const  return c.back(); 
  void push(const value_type& __x)  c.push_back(__x); //在尾部添加一个数据
  void pop()  c.pop_front(); //在头部删除一个元素
;

是不是 Qt 中没有对 deque 的实现呢?

以上是关于Qt 中的 Stack 和 STL 中的 Stack的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map

6-5-1:STL之stack和queue——stack和queue的快速入门常用接口以及适配器的概念

python两个队列实现一个栈和两个栈实现一个队列

STL之stack 和 queue

Cpp STL中的数据结构