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