🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
ヘッダファイル <algorithm>をインクルードしてreverase関数を実行してみます reverse関数を用いれば連続してメモリに格納されているデータを反転してメモリに格納し直すことができます
ヘッダファイル <algorithm>をインクルードしてreverase関数を実行してみます reverse関数を用いれば連続してメモリに格納されているデータを反転してメモリに格納し直すことができます
マックス「うん?
ということは
ヘッダファイル<algorithm>とは
何のためのファイルなんだ?」
ソーラー「ヘッダファイル<algorithm>
には
いろいろな
関数テンプレートが用意されています
ヘッダファイル<algorithm>をインクルードすることにより
それらの関数テンプレートを使用することができるようになります
それらの関数テンプレートを
用いれば
ある手順
つまり
アルゴリズム
が実行されることになります
そのため
ヘッダファイル<algorithm>は
algorithm(アルゴリズム)
という名前が付けられているんだね
さて
ヘッダファイル<algorithm>
に用意されている関数テンプレートの1つに
reverse関数テンプレートというものがあります
さっそく
ヘッダファイル<algorithm>をインクルードして
reverse関数テンプレートを使用してみましょう
どのような目的が達成されるのかな?」
#include <iostream>
#include <algorithm>//🌞ヘッダファイル<algorithm>をインクルードしています
#include <vector>
using namespace std;
#include <iostream>
using namespace std;
int main() {
vector<int> a{ 1,2,3,4,5 };
vector<int>::iterator itr = a.begin();
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout <<*(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
cout << &*itr << "\n";
cout << &*(itr + 1) << "\n";
cout << &*(itr + 2) << "\n";
cout << &*(itr + 3) << "\n";
cout << &*(itr + 4) << "\n";
reverse(a.begin(), a.end());
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout <<*(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
cout << &*itr << "\n";
cout << &*(itr + 1) << "\n";
cout << &*(itr + 2) << "\n";
cout << &*(itr + 3) << "\n";
cout << &*(itr + 4) << "\n";
return 0;
}
プログラムの実行結果
1
2
3
4
5
01140578
0114057C
01140580
01140584
01140588
5
4
3
2
1
01140578
0114057C
01140580
01140584
01140588
ソーラー「
このプログラムでは
aのvector<int>型のオブジェクト宣言、初期化
vector<int> a{ 1,2,3,4,5 };
の実行により
メモリに
数値データ
1
2
3
4
5
が格納されています
クラスvector型のクラステンプレートを用いて
データをメモリに格納していく場合は
連続したメモリにデータは格納されるのでしたね
vector<int>::iterator itr = a.begin();
が実行されると
a.begin()には
最初にメモリに格納された数値データ1を格納しているメモリの
アドレスが
戻り値として返されることになるので
イテレータitrには
最初にメモリに格納された数値データ1を格納しているメモリの
アドレスが格納されることになります
このとき
itr+1には
次にメモリに格納された数値データ2を格納しているメモリの
アドレスが格納されることになります
itr+2には
次にメモリに格納された数値データ3を格納しているメモリの
アドレスが格納されることになります
itr+3には
次にメモリに格納された数値データ4を格納しているメモリの
アドレスが格納されることになります
itr+4には
次にメモリに格納された数値データ5を格納しているメモリの
アドレスが格納されることになります
ですので
*itr
*(itr+1)
*(itr+2)
*(itr+3)
*(itr+4)
は
1
2
3
4
5
を表すことになるので
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout <<*(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
が実行されると
1
2
3
4
5
が
コマンドプロンプト画面に表示されることになります
&*itr
&*(itr+1)
&*(itr+2)
&*(itr+3)
&*(itr+4)
は
数値データ1を格納しているメモリのアドレス
数値データ2を格納しているメモリのアドレス
数値データ3を格納しているメモリのアドレス
数値データ4を格納しているメモリのアドレス
数値データ5を格納しているメモリのアドレス
をあらわすことになり
cout << &*itr << "\n";
cout << &*(itr + 1) << "\n";
cout << &*(itr + 2) << "\n";
cout << &*(itr + 3) << "\n";
cout << &*(itr + 4) << "\n";
が実行されると
数値データ1を格納しているメモリのアドレス
数値データ2を格納しているメモリのアドレス
数値データ3を格納しているメモリのアドレス
数値データ4を格納しているメモリのアドレス
数値データ5を格納しているメモリのアドレス
01140578
0114057C
01140580
01140584
01140588
がコマンドプロンプト画面に表示されることになります
a.begin()
には
最初に
メモリに格納された数値データ1を格納しているメモリのアドレス01140578が
a.end()
には
最後に
メモリに格納された数値データ3を格納しているメモリのアドレス01140588の
🍓次のアドレス01140592🍓
が
格納されることになります」
マックス「
a.end()
には
最後に
メモリに格納された数値データ3を格納しているメモリのアドレス01140588の
🍓次のアドレス01140592🍓
が
格納されることになるぅ~~か
間違えやすいところじゃんか
a.end()
には
最後に
メモリに格納された数値データ3を格納しているメモリのアドレス01140588
が代入されるわけではないんだな」
ソーラー「そうですね
間違えやすいところです
ここで
reverse関数の登場です
reverse(a.begin(), a.end());
が実行されると
アドレス01140578のメモリに数値データ1
アドレス0114057Cのメモリに数値データ2
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ4
アドレス01140588のメモリに数値データ5
が格納されていたのが
リバース(反転)して
アドレス01140578のメモリに数値データ5
アドレス0114057Cのメモリに数値データ4
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ2
アドレス01140588のメモリに数値データ1
が格納されることになります
つまり
a.begin()に格納されているアドレス
から
a.end()に格納されているアドレスの1つ前のアドレス
までのメモリに格納されているデータが
1
2
3
4
5
から
5
4
3
2
1
のように
反転していれかわるんです
ですので
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout <<*(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
が実行されると
5
4
3
2
1
がコマンドプロンプト画面に表示されることになります
普通に手動で
アドレス01140578のメモリに数値データ1
アドレス0114057Cのメモリに数値データ2
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ4
アドレス01140588のメモリに数値データ5
が格納されている状態から
リバース(反転)して
アドレス01140578のメモリに数値データ5
アドレス0114057Cのメモリに数値データ4
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ2
アドレス01140588のメモリに数値データ1
が格納されている状態にするには
意外と手間(手順)がかかります
そこで
簡単に
その手順(アルゴリズム)を実行するために
ヘッダファイル <algorithm>
をインクルードして
reverase関数がもちいられたというわけなんだね」
マックス「??
そうか?
アドレス01140578のメモリに数値データ1
アドレス0114057Cのメモリに数値データ2
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ4
アドレス01140588のメモリに数値データ5
が格納されている状態から
リバース(反転)して
アドレス01140578のメモリに数値データ5
アドレス0114057Cのメモリに数値データ4
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ2
アドレス01140588のメモリに数値データ1
が格納されている状態にすればいいんだろう?
*itr
*(itr + 1)
*(itr + 2)
*(itr + 3)
*(itr + 4)
が
1
2
3
4
5
をあらわすことになるなら
*itr =5;
*(itr + 1) =4;
*(itr + 2) =3;
*(itr + 3) =2;
*(itr + 4)=1;
を実行すれば
アドレス01140578のメモリに数値データ5
アドレス0114057Cのメモリに数値データ4
アドレス01140580のメモリに数値データ3
アドレス01140584のメモリに数値データ2
アドレス01140588のメモリに数値データ1
が代入されるんじゃないか?
そうすれば
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout <<*(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
が実行されれば
コマンドプロンプト画面
5
4
3
2
1
が表示されることになるだろう?」
その時のプログラムはこちらです
👇
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#include <iostream>
using namespace std;
int main() {
vector<int> a{ 1,2,3,4,5 };
vector<int>::iterator itr = a.begin();
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout << *(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
cout << &*itr << "\n";
cout << &*(itr + 1) << "\n";
cout << &*(itr + 2) << "\n";
cout << &*(itr + 3) << "\n";
cout << &*(itr + 4) << "\n";
*itr = 5;
*(itr + 1) = 4;
*(itr + 2) = 3;
*(itr + 3) = 2;
*(itr + 4) = 1;
cout << *itr << "\n";
cout << *(itr + 1) << "\n";
cout << *(itr + 2) << "\n";
cout << *(itr + 3) << "\n";
cout << *(itr + 4) << "\n";
cout << &*itr << "\n";
cout << &*(itr + 1) << "\n";
cout << &*(itr + 2) << "\n";
cout << &*(itr + 3) << "\n";
cout << &*(itr + 4) << "\n";
return 0;
}
プログラムの実行結果
1
2
3
4
5
00FA0578
00FA057C
00FA0580
00FA0584
00FA0588
5
4
3
2
1
00FA0578
00FA057C
00FA0580
00FA0584
00FA0588
ソーラー「あっ・・・・(^_^)/
よかったですね」
マックス「いや💦 まて、まて そうではないんだ
確かに
*itr = 5;
*(itr + 1) = 4;
*(itr + 2) = 3;
*(itr + 3) = 2;
*(itr + 4) = 1;
を実行するだけなら簡単だろうが・・・・・
メモリに格納されているデータが
1000個なら
それらのデータを反転させて
メモリに格納するのは
*itr = 5;
*(itr + 1) = 4;
*(itr + 2) = 3;
*(itr + 3) = 2;
*(itr + 4) = 1;
のように
データを1つずつ代入していく方法は無理だって💦
やっぱ 無理ィ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます