0

私のコースでは、要素を STL コンテナー (STL スタック コンテナーではなく) に格納する Stack クラスを作成するよう求められます。

要件:

  • 任意の型の要素を格納できなければなりません
  • システムに十分な空きメモリがある限り、すべてのインスタンスが挿入を受け入れます
  • 名前空間cop4530にある必要があります
  • 以下のヘッダー ファイルに示されているほとんどのメソッドと演算子のオーバーロードを使用する必要があります (back()、+=op、[]ops ではありません)。
  • .h で宣言され、別の .hpp で実装されるメソッド/関数など

次に、作成した別のプログラムでスタックを使用します。このプログラムは、中置記法の演算を後置に変更し、すべての要素が比較可能かどうかを評価します。

私の教授は、これがどのように見えるかのヘッダーファイルの例を以下に示しました。

なぜ彼はdequeポインタを使用するのですか?? STL コンテナーをスタックに適合させる多くのケースを検索して見つけましたが、STL コンテナーがスタックを指しているという説明はありませんでした。もしあれば、誰かが非ポインタを使用することの利点を説明できますか? 例のヘルプ

.h 宣言ファイルの例

#ifndef COP4530_STACK_H
#define COP4530_STACK_H

#include <iostream>
#include <deque>

namespace cop4530
{

template <typename T>
class Stack;

//----------------------------------
//     Stack<T>
//----------------------------------

template <typename T>
class Stack
{
public:
  // Constructor, Copy-constructor and destructor
  Stack  ();
  Stack  (const Stack<T>&);
  Stack  (Stack<T> &&);
  ~Stack (); 

  // member operators
  Stack<T>& operator =  (const Stack<T>&);
  Stack<T> & operator=(Stack<T> &&);
  Stack<T>& operator += (const Stack<T>&);
  const T&         operator [] (int) const;
  T&               operator [] (int);

  // other methods
  int   size        () const;
  int   capacity    () const;

  // Container class protocol
  bool         empty     () const;
  void         clear     ();
  void         push      (const T&);
  void         push      (T &&);
  void         pop       ();
  T&           top       ();
  const T&     top       () const;
  T&           back      ();


  // Display methods 
  void print    (std::ostream& os, char ofc = ' ') const;

protected:
  std::deque<T>  *mystack;   // pointer to the stack.
//std::deque<T>   mystack;   //WHY NOT THIS???

} ;

// operator overloads
template < class T >
std::ostream& operator << (std::ostream& os, const Stack<T>& a);

template < class T >
bool      operator == (const Stack<T>&, const Stack<T>&); 

template < class T >
bool      operator != (const Stack<T>&, const Stack<T>&); 

template < class T >
bool      operator <= (const Stack<T>&, const Stack<T>&);

#include "stack.hpp"

}   // namespace cop4530
#endif

.hpp の実装例

#ifndef COP4530_STACK_HPP
#define COP4530_STACK_HPP

//----------------------------------------
//     Stack<T>:: Implementations
//----------------------------------------

// operator overloads

    template <typename T>
std::ostream& operator << (std::ostream& os, const Stack<T>& s)
{

}

    template <typename T>
bool operator<=(const Stack<T>& s1, const Stack<T>& s2)
{

}

    template <typename T>
bool operator == (const Stack<T>& s1, const Stack<T>& s2)
{

}

    template <typename T>
bool operator != (const Stack<T>& s1, const Stack<T>& s2)
{

}

// public methods

    template <typename T>
Stack<T>::Stack()
    //Constructor
{

}

    template <typename T>
Stack<T>::Stack(const Stack<T>& source)
    //Copy-constructor
{

}


template <typename T>
Stack<T>::Stack(Stack<T> && source)
{

}
    template <typename T>
Stack<T>::~Stack()         
    // destructor
{

}

    template <typename T>
Stack<T>& Stack<T>::operator = (const Stack<T>& source) 
    // assignment operator
{

}

template <typename T>
Stack<T>& Stack<T>::operator = (Stack<T> && source)
{

}

    template <typename T>
Stack<T>& Stack<T>::operator += (const Stack<T>& source) 
{

}

template <typename T>
const T& Stack<T>::operator [] (int i) const                 
// element operator
{

}

    template <typename T>
T& Stack<T>::operator [] (int i)
    // element operator
{

}

template <typename T>
bool Stack<T>::empty() const
{

}

template <typename T>
int Stack<T>::size() const
{

}

    template <typename T>
void Stack<T>::push(const T& Val)
{

}

template <typename T>
void Stack<T>::push(T && Val)
{

}

    template <typename T>
void Stack<T>::pop()
{

}

    template <typename T>
void Stack<T>::clear()
{

}

template <typename T>
T&  Stack<T>::top()
{

}

template <typename T>
const T&  Stack<T>::top() const
{

}

template <typename T>
T&  Stack<T>::back()
{

}

template <typename T>
void Stack<T>::print(std::ostream& os, char ofc) const
{

}

#endif
4

0 に答える 0