vector<int>型のオブジェクトaのメンバ関数a.begin()が実行されると戻り値として最初にメモリに格納された数値データを格納しているメモリのアドレスが返されます 

つづきで~す


int(イント)「マックスは今日も好調ね」


次のプログラムをご覧ください

👇


#include <iostream>


#include <vector>


using namespace std;


int main() {


vector<int> a{ 1,2,3 };


vector<int>::iterator itr = a.begin();


cout << *itr << "\n";

cout << *(itr+1) << "\n";

cout << *(itr+2 )<< "\n";


return 0;

}


プログラムの実行結果


1

2

3





vector<int>::iterator itr = a.begin();


vector<int>::iterator itr;

itr= a.begin();


のように分けて記述することができます



                  solarplexussより


マックス「


vector<int>::iterator itr = a.begin();



vector<int>::iterator itr



イテレータitrが生成されているが


a.begin()


ってなんだ?」


ソーラー「aのvector<int>型のオブジェクト宣言


vector<int> a{ 1,2,3 };


の実行により


メモリに


連続した数値データ


1

2

3


が格納されていますが


このとき


vector<int>型のオブジェクトaのメンバ関数


a.begin()


も生成されていて使用できるようになります


つまり


クラスvector<int>のメンバ関数には


begin関数が設定されていたわけです


a.begin();


が実行されると


vector<int> a{ 1,2,3 };


の実行により


メモリに最初に格納された


数値データ

1

を格納しているメモリのアドレス


a.begin()に戻り値として返されます


つまり


vector<int>::iterator itr = a.begin();


が実行されると



ポインタ変数の役割を果たす


イテレータitrに数値データ

1

を格納しているメモリのアドレスが格納されます


ですので


*itr



数値データ1を表すことになるので


cout << *itr << "\n";


が実行されると


コマンドプロンプト画面に


1が表示されることになります


めでたし


めでたし



いや~よかったね


begin関数の使い方も分かったね」


マックス「


cout << *(itr+1) << "\n";


が実行されると


2


が表示されるのが


微妙にわっかんな~いなあ」


ソーラー「そこです


vector<int> a{ 1,2,3 };


が実行されると


数値データ1

数値データ2

数値データ3


はメモリに格納されることになるのですが



数値データ1


を格納しているメモリと


数値データ2


を格納しているメモリと


数値データ3


を格納しているメモリは


連続して並んでいるメモリになっているんです


たとえば


数値データ1


を格納しているメモリが


00FFFA60


なら


数値データ2


を格納しているメモリは


00FFFA64


数値データ3


を格納しているメモリは


00FFFA68


になります


もう少し詳しく説明すると


数値データ1

メモリに

00000000 00000000 00000000 00000001

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット


数値データ2

メモリに

00000000 00000000 00000000 00000010

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット


数値データ3

メモリに

00000000 00000000 00000000 00000011

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット



と格納されることになりますが


これらのデータは


アドレス

00FFFA60

00FFFA61

00FFFA62

00FFFA63


00FFFA64

00FFFA65

00FFFA66

00FFFA67


00FFFA68

00FFFA69

00FFFA6A

00FFFA6B

のメモリに


00000001

00000000

00000000

00000000


00000010

00000000

00000000

00000000


00000011

00000000

00000000

00000000


と格納されることになります」


てんC「


数値データ1

数値データ2

数値データ3



仲良く並んで


メモリに格納されているのですね」


ソーラー「そうなんです


そして


           イテレータitr


に数値データ

1

を格納しているメモリのアドレス


00FFFA60

が格納されると


           イテレータ(itr+1)


に数値データ

2

を格納しているメモリのアドレス


00FFFA64

が格納されることになります




           イテレータ(itr+2)


には数値データ

3

を格納しているメモリのアドレス


00FFFA68

が格納される格納されることになります



マックス「ははあ~ん


           イテレータitr


に数値データ

1

を格納しているメモリのアドレス


00FFFA60

が格納されていると


           イテレータ(itr+1)


には


00FFFA61


ではなく


00FFFA64


が格納されることになるってわけだ


00FFFA64は


数値データ2を格納しているメモリの先頭のアドレスなので


*(itr+1)



数値データ

2

をあらわすことになり


cout << *(itr+1) << "\n";


が実行されると


2


が表示されることになるわけだ


そういや


配列宣言


int hairetu[3]={1,2,3};


を実行して


メモリに


数値データ


1

2

3


を格納したときも


数値データ1

メモリに

00000000 00000000 00000000 00000001

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット


数値データ2

メモリに

00000000 00000000 00000000 00000010

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット


数値データ3

メモリに

00000000 00000000 00000000 00000011

👆    👆    👆    👆

8ビット 8ビット 8ビット  8ビット



と格納されることになり


これらのデータは


たとえば


アドレス番号

01FFFA70

01FFFA71

01FFFA72

01FFFA73


01FFFA74

01FFFA75

01FFFA76

01FFFA77


01FFFA78

01FFFA79

01FFFA7A

01FFFA7B

のメモリに


00000001

00000000

00000000

00000000


00000010

00000000

00000000

00000000


00000011

00000000

00000000

00000000


と格納されることになったよな


そして


ポインタ変数


hairetu

hairetu+1

hairetu+2



アドレス

01FFFA70

01FFFA74

01FFFA78


を格納するポインタ変数となったが


そのときも


ポインタ変数hairetu+1


アドレス01FFFA71


ではなく


アドレス01FFFA74


を格納することになった


それと


まったく同じ仕組みってわけなんだな」



































= a.begin();  みつかっちゃった💦

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る