3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

std::arrayを使って多元配列を作成する (C++11)

Last updated at Posted at 2018-06-09

この記事について

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?