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:
[CAPACITY];
T mDataint mSP;
};
template <typename T, std::size_t CAPACITY>
<T, CAPACITY>::Stack() :
Stack(0)
mSP{
}
template <typename T, std::size_t CAPACITY>
<T, CAPACITY>::~Stack()
Stack{
}
template <typename T, std::size_t CAPACITY>
void Stack<T, CAPACITY>::Push(const T& data)
{
assert(static_cast<std::size_t>(mSP) < CAPACITY);
[mSP] = data;
mData++;
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) {
.Push(static_cast<int>(i));
iStack}
for (std::size_t i = 0; i < IntStack::CAPACITY; ++i) {
std::cout << iStack.Top() << std::endl;
.Pop();
iStack}
}
実行結果:
9
8
7
6
5
4
3
2
1
0
要素の上限数が静的であれば、メモリ領域を動的に確保する必要もなくなります。また、元の実装では、上限数を GetCapacityメンバ関数で取得できるようになっていましたが、staticメンバ定数を公開する実装に変更できます。
サイト全体で表記を統一(「静的メンバ」–>「staticメンバ」)
「コンテナ」の項を、第23章へ移動。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |