2018年02月20日
《その299》 反復子を受け取る関数
下記のプログラムで、関数テンプレート print は、コンテナや配列の
・先頭要素への反復子(またはポインタ)を仮引数 first に受け取り、
・末尾要素の次の要素への反復子(またはポインタ)を仮引数 last に受け取ります。
ただし、末尾要素の次の要素というのは、実在しない仮想的なものです。
そして、関数テンプレート print は、先頭から末尾までの要素を順に表示します。
この関数テンプレート print は、ベクトル vector<> だけでなく、
両端キュー dequr<> や 双方向リスト list<> など、多くのコンテナの要素も表示することができる広い汎用性を持っています。
※ 双方向リスト list<> については、このブログの《288》
※ 両端キュー dequr<> については、このブログの《289》で扱っていますので、参考にしてください。
下記のプログラムでは、
・int型要素 を持つ 配列 a1、ベクトル b1、両端キュー c1、双方向リスト d1
・char型要素を持つ 配列 a2、ベクトル b2、両端キュー c2、双方向リスト d2
を扱っています。
関数 print に渡している引数のうち、
・a1, a2 はポインタで、
・他の b1.begin(), b1.end(), ・・・・・・ , d2.begin(), d2.end() は反復子です。
以下はプログラムです。
#include <list>
#include <deque>
#include <vector>
#include <iostream>
using namespace std;
// 関数テンプレート
// 反復子あるいはポインタを、仮引数 first, second
// で受け取り、
// first が指す要素から second が指す要素まで
// 走査し、全ての値を表示する。
/*
template<class Itr_or_Ptr>
void print(Itr_or_Ptr first, Itr_or_Ptr last) {
for (Itr_or_Ptr i = first; i != last; i++)
cout << *i << " ";
} 上の薄灰色のコードを、下記のコードに訂正します(2018/02/21)。
理由:関数テンプレートの型引数は、その関数が要求する反復子の
レベルを明確に示す名前を使うほうが良いため。
※本ブログの《302》をご参照ください。
*/
template<class InputIterator>
void print(InputIterator first, InputIterator last) {
for (InputIterator i = first; i != last; i++)
cout << *i << " ";
}
int main() {
int a1[] = { 10, 11, 12, 13, 14, 15 };
vector<int> b1{ 10, 11, 12, 13, 14, 15 };
// deque<> は、このブログの《288》をご覧ください。
deque<int> c1{ 10, 11, 12, 13, 14, 15 };
// list<> は、このブログの《289》をご覧ください。
list<int> d1{ 10, 11, 12, 13, 14, 15 };
char a2[] = { 'a', 'b', 'c', 'd', 'e' };
vector<char> b2{ 'a', 'b', 'c', 'd', 'e' };
deque<char> c2{ 'a', 'b', 'c', 'd', 'e' };
list<char> d2{ 'a', 'b', 'c', 'd', 'e' };
cout << "a1 … "; print(a1, a1 + 6);
cout << '\n';
cout << "b1 … "; print(b1.begin(), b1.end());
cout << '\n';
cout << "c1 … "; print(c1.begin(), c1.end());
cout << '\n';
cout << "d1 … "; print(d1.begin(), d1.end());
cout << '\n';
cout << "a2 … "; print(a2, a2 + 5);
cout << '\n';
cout << "b2 … "; print(b2.begin(), b2.end());
cout << '\n';
cout << "c2 … "; print(c2.begin(), c2.end());
cout << '\n';
cout << "d2 … "; print(d2.begin(), d2.end());
cout << '\n';
};
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7341838
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック