第9回はC++11での固定長配列になります。

ここからは、C++11で新登場したライブラリについての説明を行っていきます。

固定長配列を使用する場合

 1: #include <iostream>
 2: 
 3: using namespace std;
 4: 
 5: int main()
 6: {
 7:	//宣言
 8:	int arr[5];
 9:
10:	//初期化
11:	for (auto& i : arr)
12:	{
13:		i = 0;
14:	}
15:
16:	//表示
17:	for (const auto i : arr)
18:	{
19:		cout << i << endl;
20:	}
21:
22:	return 0;
23: }

今まで説明したC++11を合わせてもこのような感じになると思います。
配列の初期化を

int arr[5] = {0};

とすることも出来ますが、宣言時にしか出来ないのであまり利便性はありません。
C++11では<array>を使用することによって、より利便性のある固定長配列が使えるようになりました。

 1: #include <iostream>
 2: #include <array>
 3:
 4: using namespace std;
 5:
 6: int main()
 7: {
 8:	//宣言
 9:	array<int, 5> arr;
10:
11:	//初期化
12:	arr.fill(0);//配列内を引数の値で初期化するメンバ関数
13:
14:	//表示
15:	for (const auto i : arr)
16:	{
17:		cout << i << endl;
18:	}
19:
20:	return 0;
21: }

結果は最初のプログラムと同じになります。
9行目の宣言を見るとわかりますが、使い方は

std::array<型, サイズ>

となっています。後は通常の固定長配列と同じように扱うことが出来ます。

・・・それだけだと、あまり利点が感じられないかもしれないので他の例を出してみます。

 1: #include <iostream>
 2: #include <array>
 3: #include <algorithm>
 4:
 5: using namespace std;
 6:
 7: int main()
 8: {
 9:	//初期化の仕方は従来の配列と同じように出来る
10:	array<int, 5> a = { 1, 2, 3, 4, 5 };
11:	array<int, 5> b = { 6, 7, 8, 9, 10 };
12:
13:	auto m = [](const int& i){cout << i << endl;};
14:
15:	//イテレータを使った表示
16:	for_each(a.cbegin(), a.cend(), m);
17:	for_each(b.cbegin(), b.cend(), m);
18:
19:	a.swap(b);//配列の中身を交換する
20:
21:	//交換後の表示
22:	for_each(a.cbegin(), a.cend(), m);
23:	for_each(b.cbegin(), b.cend(), m);
24:
25:	return 0;
27: }
プログラムを見れば分かると思いますが、イテレータがあることが分かります。

つまり、このarrayを使えば他のコンテナにあるようなメンバ関数を使えるので<algorithm>と連携することが出来ます。
また、先ほどのfill()もそうですが、19行目のswap()のように初期化や交換等の関数もあるので、自前で処理を書く必要がなくなり少ないコード量にすることが出来ます。

このarrayは、"通常の固定長配列+イテレータ等の複数の機能"なので、使うことによる損は無く、むしろ利点が多いので固定長配列を使う時は<array>を使うことをオススメします。

以上でC++11での固定長配列の説明を終わります。

前→C++11講座8回
次→C++11講座10回

選択肢 投票
EMURATED 0  
EMURATED 0  
EMURATED 0  

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS