アフィリエイト広告を利用しています

広告

posted by fanblog

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';
};

g10_0023.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7341838
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。