stack 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第10章

トップページ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 には、vector や list などの STLコンテナが備えている clearメンバ関数に相当する機能がありません。自作関数として実装してください。


空になるまで popメンバ関数を呼び続けます。

#include <iostream>
#include <stack>

typedef std::stack<int> IntStack;

void ClearIntStack(IntStack& iStack)
{
    while (!iStack.empty()) {
        iStack.pop();
    }
}

int main()
{
    IntStack iStack;

    for (int i = 0; i < 5; ++i) {
        iStack.push(i);
    }

    ClearIntStack(iStack);

    std::cout << std::boolalpha << iStack.empty() << std::endl;
}

実行結果

true

関数テンプレートにすれば、要素を int型に限定する必要はありません。

#include <iostream>
#include <stack>

typedef std::stack<int> IntStack;
typedef std::stack<std::string> StringStack;

template <typename T>
void ClearStack(std::stack<T>& s)
{
    while (!s.empty()) {
        s.pop();
    }
}

int main()
{
    IntStack iStack;
    StringStack strStack;

    for (int i = 0; i < 5; ++i) {
        iStack.push(i);
        strStack.push("xxx");
    }

    ClearStack(iStack);
    ClearStack(strStack);

    std::cout << std::boolalpha
              << iStack.empty() << "\n"
              << strStack.empty() << std::endl;
}

実行結果

true
true

いずれにしても、popメンバ関数の呼び出しを繰り返すということは、内部で使用しているコンテナの pop_backメンバ関数を呼び続けているだけです。そのため、たとえば vector を使用しているとすると、内部で確保されたメモリ領域までは解放されません(第5章参照)。


参考リンク


更新履歴

’2015/10/11 新規作成。



第10章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る