第12講 ベクタの学習
第6話 反復子を使ったコードの解説その1

コード再掲
#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;
}
コード解説
   for(j=0;j<3;j++)cout<<*(i+j)<<" "; //イテレータを使いベクタの要素をコンソールに出力

   for(j=0;j<3;j++)cout<<c[j]<<" ";
と同じです。
*(i+j)の使い方からイテレータはポインタに似ていることが分かります。
   for(j=0;j<3;j++)cout<<i[j]<<" "; //イテレータを使い添え字でベクタの要素をコンソールに出力
によって、
1 2 3
と出力されていることからもイテレータとポインタが似ていることが裏付けられます。
さて、問題の
   i=c.end(); //ベクタ最終要素アドレスの次アドレスをイテレータに代入
この文です。
これを説明するために下図を用意しました。
p1
ベクタ最終要素アドレスの次アドレス=
ベクタの末尾の要素の次の変数領域の(先頭)アドレス
という長ったらしい表現の内容を
上の図から読み取って頂ければ幸いです。
変数や配列の一つ一つの要素には、
1000~1003
(わかりやすく10進数表示にしてありますが、
実際には16進数表示です。尚これは4バイトです。
1000,1001,1002,1003ですよね。)などと
メモリー領域が割り振られます。
そして、ポインタなどが扱うアドレスはメモリー領域の先頭アドレス、
今の例でいえば1000です。
ベクタの末尾の要素の次の変数領域の
(先頭)アドレスという長ったらしい表現で表しているものは
ベクタの最終アドレス+1です。
例えば、
c[0]のアドレスが1000~1003であったとすれば、
c[1]のアドレスは1004~1007
c[2]のアドレスは1008~1011
p2
となり、ベクタに割り振られているメモリー領域の
最後のアドレスは1011(上図の赤枠)ですから、
1012(上図の青枠)が ベクタの末尾の要素の次の変数領域の
(先頭)アドレスです。

この例えだと、
   i=c.end(); //ベクタ最終要素アドレスの次アドレスをイテレータに代入
でiには1012が代入されます。




第5話へ 第7話へ



a

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

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