MGL::Array
Contents
MGL::Array#
注意
このクラスは現在試験的に実装されています。今後大きな変更が加えられる可能性がある点にご注意ください。
概要#
MGL::Arrayはメモリ安全性を重視し、範囲外アクセスに寛容なゲーム開発向けの1次元動的配列クラスです。
MGL::Arrayは範囲外のインデックスにアクセスしても未定義動作や例外の送出を行うことはありません。代わりに無効値を返すようになっています。無効値はデフォルトでは0またはデフォルト構築されたオブジェクトが用いられますが、任意に変更可能です。
また、インデックスに使用する型もいずれかの整数型に任意に変更可能です。この機能は限定的な範囲アクセス、インデックス付きの範囲アクセス等の機能と組み合わせることで、より柔軟なインデックスの扱いが可能となります。
配列に使用するメモリリソースはMGL::Memoryから取得するため、必要に応じてカスタマイズされたアロケーターを利用することも可能です。また、MGL::UniquePtrと同様に所有権を持つオブジェクトのみが単独で管理し、解放処理も自動化されています。
同じ特性を備えた2次元配列版のMGL::Array2Dも利用可能です。
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
...
};
}
テンプレート引数#
- class ValueType
要素の型
- class IndexType
要素にアクセスするための座標の型。省略時は
size_t
。
要件#
ValueType
はデフォルト構築可能な型である必要があります。
IndexType
は符号付きまたは符号なしのいずれかの整数型でなければなりません。
利用例#
- 配列の生成と要素へのアクセス
// int型の配列をサイズ10で生成 MGL::Array<int> array(10); // インデックス3の要素をトレース表示。 // 特に指定がない場合、数値の配列は0で初期化される。 MGL_TRACE("array[3] = %d", array[3]); // 要素の内容を書き換えるにはGetPtr()でポインタを取得する必要がある。 // 添字アクセスは読み取り専用なため、array[3] = 3; のような記述は不可。 if (auto *value = array.GetPtr(3); value != nullptr) { *value = 3; } // 再度インデックス3の要素をトレース表示 MGL_TRACE("array[3] = %d", array[3]);
- 実行結果
array[3] = 0 array[3] = 3
- 詳細
- 要素への範囲アクセス
// int型の配列をサイズ5で生成 MGL::Array<int> array(5); // 全ての要素を3で埋める array.Fill(3); // ForEach()を用いることでインデックスと共に各々の要素にアクセス可能 array.ForEach([](auto index, const auto &value) { MGL_TRACE("array[%zu] = %d", index, value); }); // ForRange()を用いることで一部の範囲の要素にアクセス可能。 // ここでは1から3までを7に書き換えている。 array.ForRange(1, 3, [](auto &value) { value = 7; }); // 書き換え後の全ての要素をトレース表示。 // 一般的な範囲for文も利用可能であり、constを外せば書き換えも可能。 MGL_TRACE("-----------------"); for (const auto &value : array) { MGL_TRACE("%d", value); }
- 無効値と範囲外アクセス
// 配列初期化時に「無効値」を指定可能。 // Get()や添字アクセスで範囲外を指定した場合はこの無効値が返る。 // 無効値を省略した場合、値であれば0が、クラスであればデフォルト構築されたオブジェクトが // 無効値として設定される。 // ここではサイズに5、無効値に-1のint型配列を生成。 MGL::Array<int> array(5, -1); // 範囲外アクセスの例。無効値の-1が返る。 MGL_TRACE("array[10] = %d", array[10]); // 書き換え用にGetPtr()を使用する場合、範囲外を指定するとnullptrが返る。 // すなわち、特定のインデックスのみを書き換える場合はNULLチェックが必須。 if (auto *value = array.GetPtr(10); value != nullptr) { // ここには到達しない }
- 実行結果
array[10] = -1
- 詳細
- インデックスに使用する型の変更
// テンプレート引数の第2引数にはインデックスに使用する型も指定可能。 // 符号付きのインデックスを用いることは範囲をより柔軟に扱う場合に有用。 // もちろん、負のインデックスは全て範囲外扱いとなる。 // ここでは、インデックスにもint型を用いるサイズ5のint型配列を生成。 MGL::Array<int, int> array(10); // xを基準に±3の範囲にアクセスする例。 // ForRange()は範囲外のインデックスをスキップするため、xが2より小さくても // &valueに範囲外の不正な参照が届くことはない。 const int x = 2; array.ForRange(x - 3, x + 3, [](auto index, const auto &value) { MGL_TRACE("array[%d] = %d", index, value); // この場合、indexはint型になる });
メンバ情報#
種類 |
名前 |
内容 |
バージョン |
---|---|---|---|
関数 |
1.1.15+ |
||
関数 |
配列の初期化 |
1.1.15+ |
|
関数 |
配列の再初期化 |
1.1.15+ |
|
関数 |
全ての要素に指定の値を書き込み |
1.1.15+ |
|
関数 |
要素の取得 |
1.1.15+ |
|
関数 |
要素をポインタで取得 |
1.1.15+ |
|
関数 |
関数オブジェクトを用いた全ての要素へのアクセス |
1.1.15+ |
|
関数 |
関数オブジェクトを用いた指定範囲の要素へのアクセス |
1.1.15+ |
|
関数 |
指定した要素が範囲内に含まれているかを取得 |
1.1.15+ |
|
関数 |
無効値の取得 |
1.1.15+ |
|
関数 |
サイズの取得 |
1.1.15+ |
|
関数 |
先頭の要素を指すポインタを取得 |
1.1.15+ |
|
関数 |
末尾の次の要素を指すポインタを取得 |
1.1.15+ |
|
オペレータ |
演算子によるムーブ |
1.1.15+ |
|
オペレータ |
添字による要素アクセス |
1.1.15+ |
コンストラクタ#
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 配列のサイズを指定して初期化
explicit Array(
size_t arraySize = 0,
Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
// (2) サイズと無効値を指定して初期化
Array(
size_t arraySize,
const ValueType &invalidValue,
Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
// (3) 無効値を右辺値参照で指定して初期化
Array(
size_t arraySize,
ValueType &&invalidValue,
Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
// (4) ムーブコンストラクタ
Array(Array &&rhs) noexcept;
// (5) コピーコンストラクタの削除
Array(Array &) = delete;
};
}
引数#
- (1) 配列のサイズを指定して初期化
- size_t arraySize
生成する配列のサイズ。省略時は
0
。- MGL::Memory::ClearMode clearMode
配列が使用するメモリリソースのクリア方法。省略事は
Auto
。
- (2) サイズと無効値を指定して初期化
- size_t arraySize
生成する配列のサイズ
- const ValueType &invalidValue
生成する配列に設定する無効値
- MGL::Memory::ClearMode clearMode
配列が使用するメモリリソースのクリア方法。省略事は
Auto
。
- (3) 無効値を右辺値参照で指定して初期化
- size_t arraySize
生成する配列のサイズ
- const ValueType &&invalidValue
生成する配列に設定する無効値
- MGL::Memory::ClearMode clearMode
配列が使用するメモリリソースのクリア方法。省略事は
Auto
。
- (4) ムーブコンストラクタ
- Array &&rhs
移動元の配列
説明#
配列を生成・初期化するためのコンストラクタです。
テンプレート引数ValueType
には各要素の型を、IndexType
には要素にアクセスする際に指定するインデックスの型を指定します。
ValueType
はデフォルト構築可能な型である必要があり、各要素の初期値はデフォルト構築された値になります。
IndexType
の指定を省略した場合はsize_t
型になります。
(1) は生成する配列のサイズのみを指定します。このコンストラクタの引数を省略した場合はサイズ0の(無効値のみを持つ)配列を生成します。
(2) と (3) はサイズと同時に無効値を指定して初期化します。無効値は範囲外アクセスの際に代替される読み取り専用の要素です。 (3)は無効値を右辺値参照で渡した際に呼び出され、機能は(2)と同等です。
無効値を指定しなかった場合、ValueType型をデフォルト構築した値が無効値として設定されます。無効値の詳細についてはGetも参照してください。
(1)から(3)までの引数clearMode
は、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAuto
を指定した場合、ValueType
がクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。
(4) は他の配列をムーブするためのコンストラクタです。これに伴い、コピーコンストラクタは(5)によって明示的に削除されています。
サイズの変更を伴う配列の初期化はコンストラクタを呼び出した後でもNewにて行えます。また、無効値の再設定はSetInvalidValueにて行えます。
利用例#
// 空のint型配列を生成
MGL::Array<int> emptyArray;
// 空の配列は常に無効値(int型の場合はデフォルトで0)を返す。
// サイズはNew()で後から変更可能。
MGL_TRACE("emptyArray[0] = %d", emptyArray[0]);
// サイズ10、無効値に-1のint型配列を生成
MGL::Array<int> array(10, -1);
// インデックス0から9まではint型のデフォルト値である0が返るが、
// それ以降は無効値に指定した-1が返るようになる。
MGL_TRACE("array[0] = %d", array[0]);
MGL_TRACE("array[30] = %d", array[30]);
// ムーブによって配列の移動が可能。
// この場合はarrayの内容がarray2に移動し、arrayは空となる。
MGL::Array<int> array2(std::move(array));
// コピーは不可
MGL::Array<int> array3(array2); // コンパイルエラー!!
- 実行結果
emptyArray[0] = 0 array[0] = 0 array[30] = -1
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
New#
配列の初期化
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
bool New(
size_t arraySize,
Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
};
}
引数#
- size_t arraySize
配列のサイズ
- MGL::Memory::ClearMode clearMode
配列が使用するメモリリソースのクリア方法。省略事は
Auto
。
戻り値#
- bool
成功時に
true
、失敗時にfalse
。
説明#
指定したサイズで配列を初期化します。この関数は主にコンストラクタの呼び出し時点でサイズが確定していない場合の使用を想定しています。
既に配列が生成済みだった場合、既存の内容は破棄され新たな配列が生成されます。
引数clearMode
は、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAuto
を指定した場合、ValueType
がクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。
配列のサイズ分のメモリリソースを確保できなかった場合、初期化に失敗し戻り値にfalse
が返ります。
利用例#
// 一旦空の配列を生成
MGL::Array<int> array;
// 配列をサイズ10で初期化
array.New(10);
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
Renew#
配列の再初期化
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
bool Renew(Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
};
}
引数#
- MGL::Memory::ClearMode clearMode
配列が使用するメモリリソースのクリア方法。省略事は
Auto
。
戻り値#
- bool
成功時に
true
、失敗時にfalse
。
説明#
現在のサイズで配列を再初期化します。すなわち、全体サイズを変更せずに全ての要素をデフォルト構築し直します。
引数clearMode
は、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAuto
を指定した場合、ValueType
がクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。
利用例#
// サイズ10のint型配列を生成
MGL::Array<int> array(10);
// 全ての要素を3で埋める
array.Fill(3);
// 0番目の内容を表示
MGL_TRACE("(1) array[0] = %d", array[0]);
// 配列を再初期化
// 全ての要素はデフォルト(int型の場合は0)に戻る
array.Renew();
// もう一度0番目の内容を表示
MGL_TRACE("(2) array[0] = %d", array[0]);
- 実行結果
(1) array[0] = 3 (2) array[0] = 0
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
Fill#
全ての要素に指定の値を書き込み
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
constexpr void Fill(const ValueType &value) noexcept;
};
}
引数#
- ValueType value
書き込む値
説明#
配列内の全ての要素に引数でした値を書き込みます。
value
はコピー可能なオブジェクトである必要があります。
利用例#
// サイズ10のint型の配列を生成
MGL::Array<int> array(10);
// 全ての要素に 39 を書き込む
array.Fill(39);
// 全ての要素をトレース表示
for (const auto &value : array)
{
MGL_TRACE("%d", value);
}
- 実行結果
39 39 39 ...
バージョン情報#
- MGL 1.1.15
初回リリース
Get#
要素の取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr const ValueType &Get(IndexType index) const noexcept;
};
}
引数#
- IndexType index
要素へのインデックス
戻り値#
- const ValueType &
インデックスに対応した要素。範囲外の場合は無効値。
説明#
要素を読み取り専用で取得します。引数index
に0
から要素数-1までのインデックスを指定することで、その値に対応した要素の参照を返します。
この戻り値は読み取り専用であり、取得した要素を書き換えることはできません。値を書き換える必要がある場合はGetPtr、ForEach、ForRange、範囲for文のいずれかを使用してください。
範囲外のインデックスを渡した場合、コンストラクタまたはSetInvalidValueで設定した無効値を返します。無効値を明示的に設定していない場合、そのデフォルト値は初期化時に指定したMGL::Memory::ClearModeによって変化します。
戻り値が範囲内の要素であるかを調べる場合はContainsを使用してください。
この関数はoperator[]で代替できます。
利用例#
// サイズ10、無効値-1のint型の配列を生成
MGL::Array<int> array(10, -1);
// 配列の全ての要素を32で埋める
array.Fill(32);
// インデックス3の内容を表示
MGL_TRACE("array[3] = %d", array.Get(3));
// インデックス99(範囲外)の内容を表示
MGL_TRACE("array[99] = %d", array.Get(99));
- 実行結果
array[3] = 32 array[99] = -1
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
GetPtr#
要素をポインタで取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr ValueType *GetPtr(IndexType index) noexcept;
};
}
引数#
- IndexType index
要素へのインデックス
戻り値#
- ValueType *
インデックスに対応した要素へのポインタ。範囲外の場合は
nullptr
。
説明#
要素の書き込み可能なポインタを取得します。引数index
に0
から要素数-1までのインデックスを指定することで、その値に対応した要素のポインタを返します。
引数に範囲外のインデックスを渡した場合はnullptr
が返ります。安全のため、この関数の戻り値は必ずNULLチェックを行ってください。
この関数は特定の要素の内容を書き換える場合にのみ使用してください。書き換える必要がない場合はGetを、複数の要素を対象とする場合はForEachやForRange、範囲for文などを用いたほうが安全です。
注意
この関数で取得した戻り値に対し、++
や--
、添字アクセス等を行わないでください。本クラスは範囲外アクセス等の未定義動作を防ぐ目的でも用意されているため、戻り値を通常の配列のように扱う事は想定されていません。また、将来に渡って常に要素が連続配置される保証もありません。
利用例#
// サイズ10のint型の配列を生成
MGL::Array<int> array(10);
// インデックス3の要素を取得し、成功したらその内容を76に書き換える。
if (auto *value = array.GetPtr(3); value != nullptr)
{
*value = 76;
}
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
ForEach#
関数オブジェクトを用いた全ての要素へのアクセス
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 非const版
template <class LoopBody>
constexpr void ForEach(LoopBody body) noexcept;
// (2) const版
template <class LoopBody>
constexpr void ForEach(LoopBody body) const noexcept;
};
}
引数#
- LoopBody body
各々の要素にアクセスするための関数。詳細は説明を参照。
説明#
配列が保持する全ての要素に対し、関数オブジェクトを用いてアクセスを行うための関数です。指定した関数は要素ごとに、0から最大インデックスまで順に呼び出されます。
引数の関数オブジェクトに指定可能なフォーマットは次の通りです。
- 引数で要素の参照のみを受ける
// サイズ5のint型の配列を生成 MGL::Array<int> array(5); // array内の全ての要素に32を書き込み array.ForEach([](auto &value) { value = 32; }); // array内の全ての要素をトレース表示 array.ForEach([](const auto &value) // constを付けることで読み取り専用になる { MGL_TRACE("%d", value); });
- 実行結果
32 32 32 32 32
- 補足
この例のように参照のみを取得するForEach()の使用はあまり意味がなく、通常は次のような使用方法が推奨される。
// サイズ5のint型の配列を生成 MGL::Array<int> array(5); // array内の全ての要素に32を書き込み (Fill()を使用) array.Fill(32); // array内の全ての要素をトレース表示 (範囲for文を使用) for (const auto &value : array) { MGL_TRACE("%d", value); }
- 引数に要素の参照とインデックスを受ける
// サイズ5のint型の配列を生成 MGL::Array<int> array(5); // array内の全ての要素にインデックスの3倍の値を書き込む array.ForEach([](size_t index, auto &value) { value = static_cast<int>(index * 3); }); // array内の全ての要素をインデックス付きでトレース表示 array.ForEach([](size_t index, const auto &value) { MGL_TRACE("array[%zu] = %d", index, value); });
- 実行結果
array[0] = 0 array[1] = 3 array[2] = 6 array[3] = 9 array[4] = 12
- 戻り値について
関数オブジェクトの戻り値を
bool
にしてfalse
を返すことで、ループの中断が可能です。// サイズ5のint型の配列を生成 MGL::Array<int> array(5); // インデックス3に-1を書き込む if (auto *value = array.GetPtr(3); value != nullptr) { *value = -1; } // 先頭から負の値が見つかるまでをトレース表示 array.ForEach([](size_t index, const auto &value) { if (value < 0) { return false; } MGL_TRACE("array[%zu] = %d", index, value); return true; });
- 実行結果
array[0] = 0 array[1] = 0 array[2] = 0
関数オブジェクトが
void
型(値を返さない)場合は常に継続となります。
利用例#
説明を参照してください。
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
ForRange#
関数オブジェクトを用いた指定範囲の要素へのアクセス
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 非const版
template <class LoopBody>
constexpr void ForRange(
IndexType begin,
IndexType end,
LoopBody body) noexcept;
// (2) const版
template <class LoopBody>
constexpr void ForRange(
IndexType begin,
IndexType end,
LoopBody body) const noexcept;
};
}
引数#
- IndexType begin
範囲の開始インデックス
- IndexType end
範囲の終了インデックス
- LoopBody body
各々の要素にアクセスするための関数。詳細は説明を参照。
説明#
配列が保持する一定範囲の要素に対し、関数オブジェクトを用いてアクセスを行うための関数です。
引数で指定したbegin
からend
までのインデックスの要素を取得し、body
に指定した関数オブジェクトに渡して呼び出します。インデックスが範囲外になる場合はbody
の関数の呼び出しを行いません。
body
に指定可能な関数オブジェクトのフォーマットについてはForEachと同等ですので、詳細は該当関数の説明を参照してください。
呼び出し順はbegin
からend
に向かうように順に行われます。end
にはbegin
よりも小さいインデックスを指定することも可能で、その場合は逆順にbody
が呼び出されます。
利用例#
// サイズ5のint型の配列を生成
MGL::Array<int> array(5);
// インデックス1から3までの要素に32を書き込み
array.ForRange(1, 3, [](auto &value)
{
value = 32;
});
// array内の全ての要素をインデックス付きでトレース表示
array.ForEach([](size_t index, const auto &value)
{
MGL_TRACE("array[%zu] = %d", index, value);
});
// インデックス8から0までの要素をインデックス付きでトレース表示
// 範囲外のインデックスは無視されるため、8から5までは呼び出されない。
MGL_TRACE("---------------");
array.ForRange(8, 0, [](size_t index, const auto &value)
{
MGL_TRACE("array[%zu] = %d", index, value);
});
- 実行結果
array[0] = 0 array[1] = 32 array[2] = 32 array[3] = 32 array[4] = 0 --------------- array[4] = 0 array[3] = 32 array[2] = 32 array[1] = 32 array[0] = 0
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
Contains#
指定した要素が範囲内に含まれているかを取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 参照でチェック
[[nodiscard]] constexpr bool Contains(const ValueType &element) const noexcept;
// (2) ポインタでチェック
[[nodiscard]] constexpr bool Contains(const ValueType *element) const noexcept
};
}
引数#
- (1) 参照でチェック
- const ValueType &element
チェックする要素の参照
- (2) ポインタでチェック
- const ValueType *element
チェックする要素へのポインタ
戻り値#
- bool
範囲内に含まれている場合は
true
、含まれていない場合はfalse
。
説明#
指定した要素が配列の範囲内に存在しているかをチェックします。
引数element
にはValueType
の型の参照またはポインタを指定します。もしその要素が配列ないに存在している場合は戻り値にtrue
を返します。
利用例#
// サイズ5のint型の配列を生成
MGL::Array<int> array(5);
// インデックス3の要素を取得してチェック
// 範囲内の有効な値が返るため、この結果はtrueになる。
const auto &value1 = array[3];
if (array.Contains(value1))
{
MGL_TRACE("value1 は array内の要素。");
}
else
{
MGL_TRACE("value1 は array内の要素ではない。");
}
// インデックス8の要素を取得してチェック
// 範囲外となり無効値が返るため、この結果はfalseになる。
const auto &value2 = array[8];
if (array.Contains(value2))
{
MGL_TRACE("value2 は array内の要素。");
}
else
{
MGL_TRACE("value2 は array内の要素ではない。");
}
// int型のローカル変数を生成してチェック
// 配列とは無関係な値であるため、この結果はfalseになる。
int value3 = 32;
if (array.Contains(value3))
{
MGL_TRACE("value3 は array内の要素。");
}
else
{
MGL_TRACE("value3 は array内の要素ではない。");
}
- 実行結果
value1 は array内の要素。 value2 は array内の要素ではない。 value3 は array内の要素ではない。
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
SetInvalidValue#
無効値の取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 通常
constexpr void SetInvalidValue(const ValueType &value) noexcept;
// (2) 右辺値参照
constexpr void SetInvalidValue(ValueType &&value) noexcept;
};
}
引数#
- (1) 通常
- const ValueType &value
無効値として設定する値
- (2) 右辺値参照
- ValueType &&value
無効値として設定する値
説明#
Getで範囲外のインデックスを指定した際に、無効値として返す値を設定します。
引数を右辺値参照で指定した場合、無効値はコピーではなくムーブによって設定されます。コピーのコストが高い場合やコピー禁止のクラスを扱う場合などはstd::move()
と併せてこちらを利用してください。
無効値はコンストラクタの引数で指定することも可能です。
利用例#
// サイズ5のint型の配列を生成
MGL::Array<int> array(5);
// 無効値に-1を設定
array.SetInvalidValue(-1);
// インデックス8の要素を取得して表示
// 範囲外なので無効値として設定した-1が返る
MGL_TRACE("array[8] = %d", array[8]);
- 実行結果
array[8] = -1;
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
GetSize#
サイズの取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr size_t GetSize() const noexcept;
};
}
戻り値#
- size_t
配列のサイズ
説明#
初期化時に指定した配列のサイズを取得します。
配列は0からこの値が返す値-1までのインデックスにおいて有効な値を返します。
利用例#
// サイズ5のint型の配列を生成
MGL::Array<int> array(5);
// 配列のサイズを取得
MGL_TRACE("array size = %zu", array.GetSize());
- 実行結果
array size = 5
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
begin#
先頭の要素を指すポインタを取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr ValueType *begin() const noexcept;
};
}
戻り値#
配列の先頭の要素を指すポインタ
説明#
配列の先頭の要素を指すポインタを取得します。この関数は通常endと組み合わせて使用されます。
注意
この関数は範囲for文および一部の標準ライブラリの関数を利用する目的で実装されています。この関数をイテレータを取る標準ライブラリの引数以外に使用しないでください。
利用例#
// サイズ5のint型の配列を生成
MGL::Array<int> array(5);
// 範囲for文を用いて各要素に値を書き込み
// Note:
// C++の範囲for文はbeginとendを用いたコードに置き換えられるため、
// この関数が無ければ次のような範囲for文は使用できない。
int i = 3;
for (auto &value : array)
{
value = i++;
}
// 標準ライブラリの std::find() を用いて配列内に5が含まれているかをチェック
// Note:
// このようなイテレータを取る関数に利用する限りは問題無いが、
// それ以外の用途においては推奨されない。
auto result = std::find(array.begin(), array.end(), 5);
if (result != array.end())
{
MGL_TRACE("5を発見!");
}
// ❌非推奨な例
// Note:
// このコードは現時点では問題なく動作するが、将来に渡ってbegin()がポインタを返すとは限らない。
// (専用のイテレータに置き換わるかもしれない)
// 何より、生の配列を扱いたい場合、わざわざMGL::Arrayを用いる必要がない。
auto *top = array.begin();
for (size_t i = 0; i < array.GetSize(); i++)
{
MGL_TRACE("%d", top[i]);
}
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
end#
末尾の次の要素を指すポインタを取得
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr ValueType *end() const noexcept;
};
}
戻り値#
配列の末尾の次の要素を指すポインタ
説明#
配列の末尾の次の要素を指すポインタを取得します。この関数は通常beginと組み合わせて使用されます。
注意
この関数は範囲for文および一部の標準ライブラリの関数を利用する目的で実装されています。この関数をイテレータを取る標準ライブラリの引数以外に使用しないでください。
利用例#
beginの利用例を参照してください。
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
operator=#
演算子によるムーブ
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
// (1) 演算子によるムーブ
Array & operator=(Array &&rhs) noexcept;
// (2) コピーを禁止するための宣言
Array &operator=(Array &) = delete;
};
}
引数#
- Array &&rhs
ムーブ元の配列
戻り値#
- Array &
ムーブ後の配列
説明#
=
演算子によるムーブ、およびコピーを禁止するための宣言です。
=
演算子の右辺が右辺値参照である場合、その内容を左辺値へとムーブします。右辺が右辺値参照ではない場合は禁止されているコピーとなるため、コンパイルエラーとなります。
利用例#
// サイズ5のint型の配列 array を生成
MGL::Array<int> array(5);
// array を array2 へとムーブ
// これによりarrayの内容はarray2へと移り、arrayは空の配列となる。
auto array2 = std::move(array);
// コピーは禁止されているため、次のような記述は不可能。
auto array3 = array2; // コンパイルエラー!!
バージョン情報#
- MGL 1.1.15
初回リリース
関連#
operator[]#
添字による要素アクセス
宣言#
namespace MGL
{
template <class ValueType, class IndexType = size_t>
class Array
{
[[nodiscard]] constexpr const ValueType &operator[](IndexType index) const noexcept;
};
}
引数#
- IndexType index
要素へのインデックス
戻り値#
- const ValueType &
インデックスに対応した要素。範囲外の場合は無効値。
説明#
要素を読み取り専用で取得します。添字に0
から要素数-1までのインデックスを指定することで、その値に対応した要素の参照を返します。
この戻り値は読み取り専用であり、取得した要素を書き換えることはできません。値を書き換える必要がある場合はGetPtr、ForEach、ForRange、範囲for文のいずれかを使用してください。
範囲外のインデックスを渡した場合、コンストラクタまたはSetInvalidValueで設定した無効値を返します。無効値を明示的に設定していない場合、そのデフォルト値は初期化時に指定したMGL::Memory::ClearModeによって変化します。
戻り値が範囲内の要素であるかを調べる場合はContainsを使用してください。
この関数はGetと等価です。
利用例#
// サイズ10、無効値-1のint型の配列を生成
MGL::Array<int> array(10, -1);
// 配列の全ての要素を32で埋める
array.Fill(32);
// インデックス3の内容を表示
MGL_TRACE("array[3] = %d", array[3]);
// インデックス99(範囲外)の内容を表示
MGL_TRACE("array[99] = %d", array[99]);
- 実行結果
array[3] = 32 array[99] = -1
バージョン情報#
- MGL 1.1.15
初回リリース