C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも 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メンバ定数を公開する実装に変更できます。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
| X で ポスト/フォロー | LINE で送る | noteで書く |
|
|
管理者情報 | プライバシーポリシー |