第12講 ベクタの学習
第5話 反復子(イテレータ)

ベクタをアドレスで制御=操作するには、
反復子(イテレータ)を使います。
反復子(イテレータ)は、ベクタのアドレスを入れる変数です。
アドレスを入れる変数?!
結局ポインタでは?・・・
確かに、ポインタは変数や配列のアドレスを入れる変数でした。
ベクタとの違いがないように見えますが・・・

ポインタは、変数・配列のアドレスを入れるといっても、
計算をしないで入れることの出来るアドレスは、
先頭アドレスのみです。
例えば、
   int a[10];
   int *b;
   b=&a;
とすれば、良いのです。
つまり、先頭アドレスを把握していなくても代入できたわけです。
ですが、末尾のアドレスを代入するときには、
先頭アドレスから計算して
末尾のアドレスを把握しないと代入できません。
計算して把握しないと末尾のアドレスを代入することが出来ます。
なぜなら、
『ベクタ最終要素アドレスの次アドレス』を
取得する方法が用意されているからです。
『ベクタ最終要素アドレスの次アドレス』とは回りくどい言い方で、
わかりにくくて申し訳ありません。
これを正確に書くと、
『ベクタの末尾の要素の次の要素のアドレス』
ということになります。
『ベクタの末尾の要素の次の要素のアドレス』には、
『の』が5つも出てきて、ワープロからチェックされてしまいます。
『の』を少なくするために
『ベクタ最終要素アドレスの次アドレス』と表現したわけです。
???!!!?!?!という心境ですよね。
具体例を出してから、
説明した方がわかりやすいと思いますので、
具体例を出しましょう。
次のコードを組んで下さい。
#include<iostream>
#include<vector>
using namespace std;
void main(){
   int j;
   vector<int> c(3); //要素数3のベクタを用意
   for(j=0;j<3;j++)c[j]=j+1; //ベクタの各要素に値を代入
   vector<int>::iterator i; //反復子(イテレータ)=ベクタの要素のアドレスを入れる変数を用意
   i=c.begin(); //ベクタの先頭アドレスを反復子(イテレータ)に代入
   for(j=0;j<3;j++)cout<<*(i+j)<<" "; //反復子(イテレータ)を使いベクタの要素をコンソールに出力
   cout<<endl;
   for(j=0;j<3;j++)cout<<i[j]<<" "; //反復子(イテレータ)を使い添え字でベクタの要素をコンソールに出力
   cout<<endl;
   i=c.end(); //ベクタ最終要素アドレスの次アドレスを反復子(イテレータ)に代入
   for(j=1;j<4;j++)cout<<*(i-j)<<" "; //反復子(イテレータ)を使いベクタの要素をコンソールに逆順で出力
   cout<<endl;
   for(j=3;j>0;j--)cout<<*(i-j)<<" "; //反復子(イテレータ)を使いベクタの要素をコンソールに出力
   cout<<endl;
   cout<<"プロジェクト終了"<<endl;
}
参考ダウンロードファイル
出力結果
1 2 3
1 2 3
3 2 1
1 2 3
プロジェクト終了


1行1行解説していきましょう。
   vector<int>::iterator i; //反復子(イテレータ)=ベクタの要素のアドレスを入れる変数を用意
がベクタのアドレスを入れる変数である反復子(イテレータ)の宣言です。
ベクタのアドレスは、ポインタには代入できませんので、
ベクタのアドレス専用の反復子(イテレータ)を用意するわけです。
   i=c.begin(); //ベクタの先頭アドレスを反復子(イテレータ)に代入
c.begin()がベクタcの先頭アドレスです。
長くなりましたので、以降は次話で。

第4話へ 第6話へ



a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ V
BA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ