この記事について
C++11で定義されたstd::arrayを使って多元配列を記述する方法について説明します。
多元配列の記述方法
以下のように記述することで、多元配列を表現できます。
# include <array>
// int[2][3]の場合
std::array< std::array<int, 3>, 2 > mat2x3 = {0,1,2, 3,4,5};
// []を使ってアクセスできます
std::cout << mat2x3[1][1]; // 4
mat2x3[0][1] = 10; // 1 -> 10に置き換え
テンプレートによる型定義
上記のままでは定義方法が煩雑なため、テンプレートを使った型定義により利便性を向上させます。
MultiDimensionalArray.h
/**
* @file MultiDimensionalArray.h
* @brief 多元配列を作成しやすくするためのテンプレートクラス
*/
# ifndef MYLIBRARY_MULTI_DIMENSIONAL_ARRAY_H___
# define MYLIBRARY_MULTI_DIMENSIONAL_ARRAY_H___
//-------------------------------------------------------
// includes
//-------------------------------------------------------
# include <iostream>
# include <array>
//-------------------------------------------------------
// namespace
//-------------------------------------------------------
namespace mylibrary{
//-------------------------------------------------------
// public classes
//-------------------------------------------------------
// テンプレートの可変引数を利用して、<Type,2,3>や<Type,2,3,4>などを定義できるようにします
// <Type,2,3> :Type[2][3]
// <Type,2,3,4>:Type[2][3][4]
// となります。
template <class T, std::size_t N, std::size_t... M>
struct MultiDimensionalArrayType
{
// arrayのネスト部分の型定義
// MultiDimensionalArrayType<Type, N, M,・・・>::typeで
// std::array< std::array< std::array< Type,・・・>, M > N >を表現できます
using nested = typename MultiDimensionalArrayType<T, M...>::type;
using type = std::array<nested, N>;
};
template <class T, std::size_t N>
struct MultiDimensionalArrayType<T, N>
{
using type = std::array<T,N>;
};
// MultiDimensionalArrayType<Type, N, M,・・・>::typeの「type」を書かなくてもよいように
// 型名を置き換えます。利用者側はMultiDimensionalArrayを使います
template <class T, std::size_t N, std::size_t... M>
using MultiDimensionalArray = typename MultiDimensionalArrayType<T, N, M...>::type;
} // namespace
# endif // include guard
MultiDimensionalArrayを使うことで、わかりやすく多元配列を定義できます。定義後の変数の使い方はstd::arrayと同様で、[]によるアクセスが可能です
main.cpp
# include "MultiDimensionalArray.h"
int main(){
mylibrary::MultiDimensionalArray<float,2,3> mat2x3;
std::cout << mat2x3[1][1];
mat2x3[0][1] = 10;
return 0;
}
補足
boostを使える環境であれば、boost::multi_arrayで同様に多元配列を扱うことができます。
boost::multi_array
https://www.boost.org/doc/libs/1_63_0/libs/multi_array/doc/user.html