先頭へ戻る

テンプレート仮引数 解答ページ | Programming Place Plus C++編【言語解説】 第22章

Programming Place Plus トップページC++編

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① Stackクラステンプレートに、要素の上限数を指定するノンタイプテンプレート仮引数を追加し、 任意の型の要素を扱う固定サイズのスタックを作成してください。


#include <iostream>
#include <cassert>

template <typename T, std::size_t CAPACITY>
class Stack {
public:
    static const std::size_t CAPACITY = CAPACITY;

public:
    Stack();
    ~Stack();

    void Push(const T& data);
    void Pop();
    inline const T Top() const
    {
        return mData[mSP - 1];
    }

    inline std::size_t GetSize() const
    {
        return mSP;
    }

private:
    T                      mData[CAPACITY];
    int                    mSP;
};

template <typename T, std::size_t CAPACITY>
Stack<T, CAPACITY>::Stack() :
    mSP(0)
{
}

template <typename T, std::size_t CAPACITY>
Stack<T, CAPACITY>::~Stack()
{
}

template <typename T, std::size_t CAPACITY>
void Stack<T, CAPACITY>::Push(const T& data)
{
    assert(static_cast<std::size_t>(mSP) < CAPACITY);
    mData[mSP] = data;
    mSP++;
}

template <typename T, std::size_t CAPACITY>
void Stack<T, CAPACITY>::Pop()
{
    assert(mSP > 0);
    mSP--;
}


int main()
{
    typedef Stack<int, 10> IntStack;

    IntStack iStack;

    for (std::size_t i = 0; i < IntStack::CAPACITY; ++i) {
        iStack.Push(static_cast<int>(i));
    }

    for (std::size_t i = 0; i < IntStack::CAPACITY; ++i) {
        std::cout << iStack.Top() << std::endl;
        iStack.Pop();
    }
}

実行結果:

9
8
7
6
5
4
3
2
1
0

要素の上限数が静的であれば、メモリ領域を動的に確保する必要もなくなります。また、元の実装では、上限数を GetCapacityメンバ関数で取得できるようになっていましたが、staticメンバ定数を公開する実装に変更できます。


参考リンク


更新履歴

’2018/7/13 サイト全体で表記を統一(「静的メンバ」–>「staticメンバ」)

’2015/12/20 「コンテナ」の項を、第23章へ移動。

’2015/11/15 新規作成。



第22章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー