サーチ…


パラメーター

パラメータ定義
class T 配列メンバーのデータ型を指定します。
std::size_t N 配列内のメンバー数を指定します。

備考

std::array使用するには、 #include <array>を使用して<array>ヘッダを含める必要があります。

std :: arrayの初期化

std::array<T, N>初期化Tはスカラー型、 NT型の要素の数

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は非スカラー型、 NT型の要素の数です。

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);
    
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow