C++
std :: array
サーチ…
パラメーター
パラメータ | 定義 |
---|---|
class T | 配列メンバーのデータ型を指定します。 |
std::size_t N | 配列内のメンバー数を指定します。 |
備考
std::array
使用するには、 #include <array>
を使用して<array>
ヘッダを含める必要があります。
std :: arrayの初期化
std::array<T, N>
初期化T
はスカラー型、 N
はT
型の要素の数
T
がスカラー型の場合、 std::array
は次のように初期化できます。
// 1) Using aggregate-initialization
std::array<int, 3> a{ 0, 1, 2 };
// or equivalently
std::array<int, 3> a = { 0, 1, 2 };
// 2) Using the copy constructor
std::array<int, 3> a{ 0, 1, 2 };
std::array<int, 3> a2(a);
// or equivalently
std::array<int, 3> a2 = a;
// 3) Using the move constructor
std::array<int, 3> a = std::array<int, 3>{ 0, 1, 2 };
std::array<T, N>
初期化T
は非スカラー型、 N
はT
型の要素の数です。
T
が非スカラー型の場合、 std::array
は次のように初期化できます。
struct A { int values[3]; }; // An aggregate type
// 1) Using aggregate initialization with brace elision
// It works only if T is an aggregate type!
std::array<A, 2> a{ 0, 1, 2, 3, 4, 5 };
// or equivalently
std::array<A, 2> a = { 0, 1, 2, 3, 4, 5 };
// 2) Using aggregate initialization with brace initialization of sub-elements
std::array<A, 2> a{ A{ 0, 1, 2 }, A{ 3, 4, 5 } };
// or equivalently
std::array<A, 2> a = { A{ 0, 1, 2 }, A{ 3, 4, 5 } };
// 3)
std::array<A, 2> a{{ { 0, 1, 2 }, { 3, 4, 5 } }};
// or equivalently
std::array<A, 2> a = {{ { 0, 1, 2 }, { 3, 4, 5 } }};
// 4) Using the copy constructor
std::array<A, 2> a{ 1, 2, 3 };
std::array<A, 2> a2(a);
// or equivalently
std::array<A, 2> a2 = a;
// 5) Using the move constructor
std::array<A, 2> a = std::array<A, 2>{ 0, 1, 2, 3, 4, 5 };
要素アクセス
1. at(pos)
境界チェックを行う位置pos
の要素への参照を返します。 pos
がコンテナの範囲内にない場合は、 std::out_of_range
型の例外がスローされます。
複雑さは定数O(1)である。
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
arr.at(0) = 2;
arr.at(1) = 4;
arr.at(2) = 6;
// read values
int a = arr.at(0); // a is now 2
int b = arr.at(1); // b is now 4
int c = arr.at(2); // c is now 6
return 0;
}
2) operator[pos]
境界チェックなしでpos
位置にある要素への参照を返します。 pos
がコンテナの範囲内にない場合、実行時セグメンテーション違反エラーが発生する可能性があります。このメソッドは、従来の配列と同等の要素アクセスを提供し、 at(pos)
よりも効率的です。
複雑さは定数O(1)である。
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
arr[0] = 2;
arr[1] = 4;
arr[2] = 6;
// read values
int a = arr[0]; // a is now 2
int b = arr[1]; // b is now 4
int c = arr[2]; // c is now 6
return 0;
}
3) std::get<pos>
この非メンバ関数は、境界チェックなしでコンパイル時定数位置pos
要素への参照を返します。 pos
がコンテナの範囲内にない場合、実行時セグメンテーション違反エラーが発生する可能性があります。
複雑さは定数O(1)である。
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
std::get<0>(arr) = 2;
std::get<1>(arr) = 4;
std::get<2>(arr) = 6;
// read values
int a = std::get<0>(arr); // a is now 2
int b = std::get<1>(arr); // b is now 4
int c = std::get<2>(arr); // c is now 6
return 0;
}
4) front()
コンテナ内の最初の要素への参照を返します。空のコンテナのfront()
呼び出しは定義されていません。
複雑さは定数O(1)である。
注意:コンテナcの場合、式c.front()
は*c.begin()
と同等です。
#include <array>
int main()
{
std::array<int, 3> arr{ 2, 4, 6 };
int a = arr.front(); // a is now 2
return 0;
}
5) back()
コンテナ内の最後の要素への参照を返します。空のコンテナでback()
を呼び出すback()
は定義されていません。
複雑さは定数O(1)である。
#include <array>
int main()
{
std::array<int, 3> arr{ 2, 4, 6 };
int a = arr.back(); // a is now 6
return 0;
}
6) data()
要素ストレージとして機能する基本配列へのポインタを返します。ポインタは、 range [data(); data() + size())
コンテナが空の場合でもrange [data(); data() + size())
は常に有効な範囲です(この場合、 data()
は逆参照できません)。
複雑さは定数O(1)である。
#include <iostream>
#include <cstring>
#include <array>
int main ()
{
const char* cstr = "Test string";
std::array<char, 12> arr;
std::memcpy(arr.data(), cstr, 12); // copy cstr to arr
std::cout << arr.data(); // outputs: Test string
return 0;
}
配列のサイズの確認
C
スタイルの配列と比較してstd::array
主な利点の1つは、 size()
メンバー関数を使用して配列のサイズを確認できることです
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
cout << arr.size() << endl;
}
配列の反復処理
std::array
はSTLコンテナであり、 vector
ような他のコンテナと同様の範囲ベースのforループを使用できます
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
for (auto i : arr)
cout << i << '\n';
}
一度にすべての配列要素を変更する
メンバ関数fill()
は、初期化後に一度に値を変更するためにstd::array
で使用できます
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
// change all elements of the array to 100
arr.fill(100);
}