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++編を作成中です。
問題① 部分特殊化の1つ目のパターン「T型を T*型で部分特殊化する」において、ポインタであるかそうでないかによって、printメンバ関数の実装を変えられることを示しました。同様のことを、関数テンプレートで行うとすれば、どう実装しますか?
関数テンプレートは部分特殊化できませんが、大抵の場合、オーバーロードで代用できます。
#include <iostream>
template <typename T>
inline void Print(T v)
{
std::cout << v << std::endl;
}
template <typename T>
inline void Print(T* p)
{
std::cout << *p << std::endl;
}
int main()
{
int a = 10;
(a);
Print(&a);
Print}
実行結果:
10
10
厳密なルールは複雑ですが、ある関数呼び出しについて、合致する関数が複数ある場合、より良く一致するものが選択されます。実引数がポインタであれば、単なる T型の仮引数を持つ関数よりも、T*型の仮引数を持つ関数の方が優先されます。
なお、次のように、クラステンプレートの部分特殊化を用意して対応する方法もあります。
#include <iostream>
template <typename T>
struct Printer {
static inline void Print(T v)
{
std::cout << v << std::endl;
}
};
template <typename T>
struct Printer<T*> {
static inline void Print(T* p)
{
std::cout << *p << std::endl;
}
};
template <typename T>
inline void Print(T v)
{
<T>::Print(v);
Printer}
template <typename T>
inline void Print(T* p)
{
<T*>::Print(p);
Printer}
int main()
{
int a = 10;
(a);
Print(&a);
Print}
実行結果:
10
10
問題② 標準ライブラリに含まれる STLコンテナ、「vector」「list」「deque」「set」「map」は、それぞれどんなデータ構造を提供しますか?
STLコンテナは、C++プログラミングを楽にするために、非常に重要です。少しずつでも練習して、使いこなせるようになってください。
vector(【標準ライブラリ】第5章)は、動的配列を提供します。重要な STLコンテナの中でも、特に群を抜いて使用頻度・使用価値が高いので、確実に理解すべきです。
list(【標準ライブラリ】第6章)は、双方向連結リスト(アルゴリズムとデータ構造編【データ構造】第4章)です。
deque(【標準ライブラリ】第7章)は、両端待ち行列(アルゴリズムとデータ構造編【データ構造】第11章)です。
set(【標準ライブラリ】第8章)は、ソートされた集合を提供します。格納する値そのものを、ソートためのキーとして使用する点が、map との違いになっています。通常、木構造を使って実装されます。
map(【標準ライブラリ】第9章)も set と同様に、ソートされた集合を提供します。set が、格納する値そのものを、ソート順を定義するキーとして使用するのに対し、map は、キーと値を分けており、互いをペアにして格納します。通常、木構造を使って実装されます。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |