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++編を作成中です。
問題① どの 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};
(table, table + 5);
IntList lst(lst);
PrintElements
(table, table + 5);
IntSet iSet(iSet);
PrintElements
std::string s("abcde");
(s);
PrintElements}
実行結果:
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 のように、ランダムアクセスイテレータに属するイテレータであれば、ここで「<」を使っても動作しますが、他のカテゴリでは「<」が定義されていないため、コンパイルできなくなります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |