ヘッダファイル<array>をインクルードしクラスarray型のクラステンプレートを使用してできるクラスarray型のデータ構造を観察してみましょう

てんC「コンテナクラスにはヘッダファイル<array>


というものが用意されていますが


このarray



英語で


              配列


を意味しています


このarrayが用いられたヘッダファイル<array>



どのようなヘッダファイルなのですか?」


ソーラー「そうだね 配列という名前のヘッダファイルとは


面白いヘッダファイルだね


では


ヘッダファイル<array>をインクルードして


array型のクラステンプレートが用いられたプログラムを


観察してみることにしましょう」


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

👇


#include <iostream>

#include <array>//🌞ヘッダファイル<array>をインクルードしています


using namespace std;


int main()

{

array<int, 5> arr{ 1, 2, 3, 4, 5 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}


プログラムの実行結果


1

2

3

4

5


ソーラー「ヘッダファイル<array>をインクルードすることにより


array型のクラステンプレート


を用いることができるようになります


このプログラムでは


arrのarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されています


この


array<int, 5> arr{ 1, 2, 3, 4, 5 };


の仕組みはどうなっているのでしょうか?



array<int, 5> arr{ 1, 2, 3, 4, 5 };



arrのクラスarray<int, 5>型のオブジェクト宣言なんです


これだと意味が分かりにくいですが


array型のクラステンプレートの仕組みは


配列の仕組みとそっくりなんです


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されることは


arrのint型の配列宣言


int arr[5]={ 1, 2, 3, 4, 5 };


が実行されることととても似ています



array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されると


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


まずは


array<int, 5> の部分ですね


array<int, 5>のようにint


が記述されると


メモリに格納されるデータはint型の形式で格納されることになります


そして


intにつづいて


(セミコロン),5


が記述されていますね


5が記述されると


配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

が生成されることになります


arr{ 1, 2, 3, 4, 5 }の


1

2

3

4

5

を要素といいますが


このようにブロック{}内に


1

2

3

4

5


が記述されると


配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]



1

2

3

4

5


が代入されることになります


ですので


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


が実行されると


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


1

2

3

4

5


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


マックス「なんか


ほんとに


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されることは


arrのint型の配列宣言


int arr[5]={ 1, 2, 3, 4, 5 };


が実行されることと似ているな」


ソーラー「そうなんです


たとえば


array<int, 5> arr{ 1, 2, 3, 4, 5 };


ではなく


array<int, 5> arr{ 1,2 };


のように


要素を減らしたとします


配列変数は


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]


のように


5個生成されるのに


要素を


2つしか記述しない場合は


配列宣言


int arr[5]={ 1, 2 };


の場合のときと同様に


配列変数


arr[0]に1

arr[1]に2

が代入され


残りの配列変数


arr[2]

arr[3]

arr[4]

には


0

が代入されることになります


その時のプログラムはこちらです

👇


#include <iostream>

#include <array>


using namespace std;


int main()

{

array<int, 5> arr{ 1, 2 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}


プログラムの実行結果


1

2

0

0

0


マックス「だがしかし


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されることと


arrのint型の配列宣言


int arr[5]={ 1, 2, 3, 4, 5 };


が実行されることにはちがいがあるんだろう( ̄▽ ̄)」


ソーラー「そうなんです


例えば


arrのint型の配列宣言


int arr[5]={ 1, 2, 3, 4, 5 };


なら


int arr[]={ 1, 2, 3, 4, 5 };


のように


[]の中の5を省略することができますが


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


の場合は


array<int> arr{ 1, 2, 3, 4, 5 };



5を省略することはできません


その時のプログラムはこちらです

👇

#include <iostream>

#include <array>


using namespace std;


int main()

{

array<int> arr{ 1,2,3,4,5 };//👈ここです


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}


プログラムの実行結果



エラー C2678 二項演算子 '[': 型 'std::array' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 10

エラー C2678 二項演算子 '[': 型 'std::array' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 11

エラー C2678 二項演算子 '[': 型 'std::array' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 12

エラー C2678 二項演算子 '[': 型 'std::array' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

エラー C2678 二項演算子 '[': 型 'std::array' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

エラー (アクティブ) E0442 クラス テンプレート "std::array" の引数が少なすぎます

エラー C2976 'std::array': テンプレート 引数の数が少なすぎます

エラー C2514 'std::array': クラスにコンストラクターが定義されていません。


てんC「エラー C2976 'std::array': テンプレート 引数の数が少なすぎます



そのことをしめしているというわけですね」


ソーラー「違いはまだまだ あるんだよ」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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