第12講 ベクタの学習
第7話 反復子を使ったコードの解説その2
コード再掲
#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;
}
コード解説
i=c.end();
によって、iに1012が代入されたとすると、
for(j=1;j<4;j++)cout<<*(i-j)<<" ";
の出力結果が
3 2 1
と逆順になるのはどうしてでしょうか。
トレースしてみましょう。
j=1のとき、
cout<<*(i-j)<<" "; は
cout<<*(1012-4)<<" ";
です。
えっ?!
j=1だから、
cout<<*(1012-1)<<" ";
じゃないの?
違うですよ。
vector<int> c(3); //要素数3のベクタを用意
ベクタの各要素はint型で定義されています。
そして、int型は4バイトでした。
ポインタのところで学習したように、
4バイトの変数が割り振られている場合
アドレスを1引く毎に自動的に4引いてくれるのです。
ですから、
cout<<*(1012-4)<<" ";
すなわち、
cout<<*(1008)<<" ";
1008はc[2]の先頭アドレスです。
ですから、
cout<<*(1008)<<" ";
によって出力されるのはc[2]の内容であった3ということになります。
次ぎに、
j=2のとき、
cout<<*(i-j)<<" "; は
cout<<*(1012-8)<<" ";すなわち
cout<<*(1014)<<" ";
です。1014はc[1]の先頭アドレスです。
ゆえに、c[1]の内容である2が出力されるわけです。
最後、
j=3のとき、
cout<<*(i-j)<<" "; は
cout<<*(1012-12)<<" ";すなわち
cout<<*(1000)<<" ";
です。1000はc[0]の先頭アドレスです。
ゆえに、c[0]の内容である1が出力されるわけです。
というわけで、
3 2 1
と逆順に表示されることになるのです。
for(j=3;j>0;j--)cout<<*(i-j)<<" "; //イテレータを使いベクタの要素をコンソールに出力
については次話で解説しますが、
是非ご自分でトレースをなさってください。
第6話へ 第8話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ