🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
a.push_back(x)が実行されてメモリに格納された数値データもイテレータを用いてコマンドプロンプト画面に表示することができます
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(イント)「ちょおと かしこくなったね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます