固定長配列(std::array)
C++11から固定長配列(std::array)が追加されました。通常の配列を使わずこちらを使用するべきというお話です。
私は少し古い人間でしてC++11以前の環境で過ごしてきました。
そんな私がこれを知って感動したのです。こんな素晴らしいものがあるのかと。
まあvectorでもいいんですけどね。でも固定長なのにvector使うのはなんだかなぁと思いませんか。
要素数がsize()を使って取れる
通常の配列だとsizeof(a)/sizeof(a[0])
としたりするかと思います。特に問題があるというわけではありませんがa.size()
とした方がスッキリしませんか。
あとミスが少なくなります。私は定数で要素数を扱っているとたまに間違えるんですね。1種類しかないならいいのですが複数あると、特に多次元配列を使っていると間違えることが結構あります。
イテレータで扱える
そうなるとSTLのアルゴリズムを使えるわけです。
std::array<int, 4> a = { 74, 131, 45 , 39 }; std::sort(a.begin(), a.end());
いいですね。便利です。
まあでもここまでは大したことではありません。
オーバーランを検知してくれる
std::arrayを使うべきという最大の理由です。
例えば以下のコード。乱暴ですがどう出力されるか。
int a[4] = { 0, 1, 2 , 3 }; std::cout << a[5] << std::endl;
答えは不定ですね。ですが問題なく出力されます。
こういったことで厄介なのは正常に動作しているかのように動くことがある点です。
そして再現率が低い不具合として出てきてしまいます。
std::arrayを使うと実行時に不正アクセスしていますよと教えてくれます。
std::array<int, 4> a = { 0, 1, 2 , 3 }; std::cout << a[5] << std::endl;// ここでアサートで止まります
これがあったなら過去のいくつかの不具合に悩まされることはなかったのに。
でも今後はこれですぐに問題が発見できますね。
というわけで固定長の配列は全部std::arrayに変わっていいですね。たぶん。
欠点は要素数ごとに型が異なってしまうことでしょうか。vectorなら問題ないのですが。