イテレータ 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第14章

トップページ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++編を作成中です。

問題①

問題① どの STLコンテナに対しても使えるように、すべての要素の値を標準出力へ書き出す、関数テンプレートを作成してください。


どの STLコンテナでもイテレータを使えるので、要素の走査をイテレータで行えば、1つの関数テンプレートで実現できます。

#include <iostream>
#include <list>
#include <set>
#include <string>

template <typename Container>
inline void PrintElements(const Container& c)
{
    const typename Container::const_iterator itEnd = c.end();
    for (typename Container::const_iterator it = c.begin(); it != itEnd; ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

int main()
{
    typedef std::list<int> IntList;
    typedef std::set<int> IntSet;

    const int table[] = {0, 1, 2, 3, 4};

    IntList lst(table, table + 5);
    PrintElements(lst);

    IntSet iSet(table, table + 5);
    PrintElements(iSet);

    std::string s("abcde");
    PrintElements(s);
}

実行結果

0 1 2 3 4
0 1 2 3 4
a b c d e

PrintElements関数内で、「Container::const_iterator it」のような部分では、頭に「typename」が必要になることに注意してください。これは、「const_iterator」の部分が型名であることを明確にするために必要です(【言語解説】第20章参照)。

なお、for の条件式の部分には「!=」を使うことにも注目しておきましょう。対象のコンテナが vector や string のように、ランダムアクセスイテレータに属するイテレータであれば、ここで「<」を使っても動作しますが、他のカテゴリでは「<」が定義されていないため、コンパイルできなくなります。


参考リンク


更新履歴

’2015/11/7 新規作成。



第14章のメインページへ

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

Programming Place Plus のトップページへ



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