プログラミング学習記録【21日目】/ テンプレート、イテレータ、repマクロ
4.03.テンプレート
テンプレート
構造体や関数の型を一般化するための機能
関数テンプレート
同様の処理を行うが、使用している方が異なる関数をまとめることができる。STLにて定義されている min,max といった関数は関数テンプレートを用いて定義されている。
関数テンプレートの宣言は以下のように行う。
template <typename テンプレート引数>
返り値の型 関数名(引数の型 引数...(必要な文だけ書く))
{
//処理
}
同様に、構造体、定数などでもテンプレートを用いることができる。
4.04.イテレータ
イテレータ
配列やmapなどのコンテナの各要素に対し、順番に処理を行う場合に用いることができる、処理の一般化。STLでは、sortがイテレータを引数に取る。この場合、配列.begin()や.end()がイテレータを表していた。イテレータの型はコンテナごとに定義され、複雑になるので、宣言の際にはautoを用いるのが一般的。.end()が示すイテレータは最後の要素ではない点に注意。示しているのは最後の要素の次の要素の場所を示しているため。
AP4- 付録4.ループの裏技repマクロ
ループ構文は、シンプルなループの繰り返しの機能となるrepマクロを用いることで簡単に記述を行うことができる。
プログラム経験者の中には、構文拡張となるマクロを定義するべきではない、といった意見を持つ人がいるが、repマクロひとつ程度では問題が発生することは殆どない。repマクロが標準の記法ではないことを理解して用いれば良い。
repマクロは標準の機能ではないので、使う前に定義を行う必要がある。定義は以下のように行う。
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
repマクロを用いる際には以下のように書く。
rep(i, 回数)
{
処理
}
この記述を用いることで、for文の煩雑さを回避できる他、記述が簡単に行えるため、理解しやすいプログラムを書くことができる。
repマクロは通常のループ構文と同じように、breakやcontinueといったループを制御する命令を用いることもできる。
このように非常に便利な構文なのだが、C++の標準の構文ではなく、マクロを用いている。多人数で開発を行う場合、様々な構文がマクロで定義されると、プログラムが過度に複雑になってしまうなどと言った理由から、マクロによる構文の定義を禁止している場合がよくある。コーディングルールをあらかじめ確認しておき、利用することが前提条件となる。
これで、C++入門のAPG4bが一通り終了した。次回からは、AtCoder Beginners Selection というページが有ったので、これに取り組んでみようと思う。終わり次第いよいよ過去問とご対面だ。
この記事が気に入ったらサポートをしてみませんか?