a.push_back(x)が実行されてメモリに格納された数値データもイテレータを用いてコマンドプロンプト画面に表示することができます

ソーラー「それではつづきで~す


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

👇

#include <iostream>


#include <vector>


using namespace std;


int main() {


vector<int> a;


int x;


x = 1;

cout<<x<<"\n";

cout<<&x<<"\n";

a.push_back(x);



x = 2;

cout<<x<<"\n";

cout<<&x<<"\n";

a.push_back(x);



x = 3;

cout<<x<<"\n";

cout<<&x<<"\n";

a.push_back(x);


return 0;

}


プログラムの実行結果


1

00FFFA60

2

00FFFA60

3

00FFFA60


ソーラー「このプログラムが実行されると


変数xが管理しているメモリとは別の


連続したメモリに


数値データ

1

2

3


が格納されましたね。


今度は


これらのメモリに格納された数値データを


コマンドプロンプト画面に表示してみたいと思います


#include <iostream>


#include <vector>//👈渋いですね


using namespace std;


int main() {


vector<int> a;


int x;


x = 1;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 2;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 3;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



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


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

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

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


return 0;

}


プログラムの実行結果


1

00DDFB6C

2

00DDFB6C

3

00DDFB6C

1

2

3



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


vector<int> a;


int x;


x = 1;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 2;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 3;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);


の実行により


どこかのメモリに


連続した数値データ


1

2

3


が格納されていますが


このとき


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


a.begin()


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


a.begin();


が実行されると


x = 1;

a.push_back(x);


の実行により


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


数値データ

1

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


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


マックス「最初に


x = 1;

a.push_back(x);


の実行により



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



数値データ

1

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


a.begin()に戻り値として返されるのか


面白い仕組みだな」


ソーラー「


つまり


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


が実行されると



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


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

1

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


ですので


*itr



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


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


が実行されると


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


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


マックス「で


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


が実行されると


2


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


が実行されると


3


が表示されるということか そ~なのかあ?」



ソーラー「そうなんです


それにしても


x = 1;

a.push_back(x);



変数が格納しているメモリとは別の


メモリに数値データ1を格納できるなんて面白いね」


マックス「


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


を実行して


イテレータitrに


a.begin()


すなわち


一番最初に数値データ1を格納することになったメモリのアドレス


を代入しなくても


itのint*型のポインタ変数宣言、初期化


int* it=a.begin();


を実行して


ポインタ変数itに


a.begin()


すなわち


数値データ1を格納しているメモリのアドレス


を代入すればいいんじゃないか?


その方法でも同じビルド実行結果が得られるんじゃないか?


そんな感じ~がするんだが(´▽`*)」


ぶーにゃん「にゃ~ん」


マックス「そのプログラムはこれだ!


👇

#include <iostream>


#include <vector>


using namespace std;


int main() {


vector<int> a;


int x;


x = 1;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 2;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 3;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



int* it=a.begin();


cout << *it << "\n";

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

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


return 0;

}


ビルド実行結果


C2440 '初期化中': 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>' から 'int *' に変換できません。

エラー (アクティブ) E0413 "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>" から "int *" への適切な変換関数が存在しません


マックス「だ、だめか」


てんC「この実行結果は


int*型のポインタ変数 itに


a.begin()を代入することができないことを表しています


どうやら


a.begin()



vector<int>::iterator itr


を実行して生成されたイテレータitrにしか代入できないようです


なにか特殊な仕組みが存在しているようですね」



(このことは異なる型のポインタ変数に異なる型のポインタ変数が代入できない仕組みが関係しています)



マックス「ならば


イテレータにxのアドレスを代入する


vector<int>::iterator itr = &x;


は実行できるのか?


ふっ 面白くなってきたぜ


そのプログラムはこれだ!」

👇


#include <iostream>


#include <vector>


using namespace std;


int main() {


vector<int> a;


int x;


x = 1;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 2;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



x = 3;

cout << x << "\n";

cout << &x << "\n";

a.push_back(x);



vector<int>::iterator itr = &x;//👈😊ここです




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

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

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


return 0;

}


ビルド実行結果


エラー C2440 '初期化中': 'int *' から 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>' に変換できません。

エラー (アクティブ) E0415 "int *" から "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>" に変換するための適切なコンストラクターが存在しません


マックス「おう やっぱりだめか


イテレータはポインタ変数と似たような働きをするが


完全なポインタ変数というわけではないみたいだな」


てんC「どうやら


イテレータitrは


itrのオブジェクト宣言


vector<int>::iterator itrにより生成された


クラスiteratorのオブジェクトなので


クラスiterator型のオブジェクトしか代入できないのかもしれませんね


クラスiterator型のオブジェクトには


クラスiterator型のオブジェクトでない


int型の変数xのアドレスを代入することはできないというわけです」





int(イント)「ちょおと かしこくなったね」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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