C++ コンテナクラス<array>

C++11 標準では、<array>ヘッダファイルが導入されました。これは固定サイズの配列コンテナを提供し、C 言語の配列と比較して、より優れた型安全性とメモリ管理特性を持っています。

std::arrayこれは、C++ 標準ライブラリ内のテンプレートクラスであり、<array>ヘッダファイル内に定義されています。std::arrayこのテンプレートクラスは、固定サイズの配列を提供します。そのサイズはコンパイル時に決定され、動的に変更することはできません。

構文

std::arrayの基本構文は次のとおりです。

#include <array>

std::array<T, N> array_name;
  • Tは配列内の要素の型です。
  • Nは配列のサイズで、非負の整数でなければなりません。

宣言と初期化

<array>コンパイル時にサイズを決定する必要があり、動的に変更することはできません。使用例:

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 声明一个定长为5的int数组
    return 0;
}

特徴

  • 型安全性:std::array型チェックを強制し、C 言語の配列における型安全性の欠如という問題を回避します。
  • 固定サイズ:配列のサイズはコンパイル時に決定され、実行時に変更することはできません。
  • メモリ連続性:std::arrayの要素はメモリ内で連続して格納されているため、要素に効率的にアクセスできます。
  • 標準コンテナ:std::arrayは、...と同様のstd::vectorインターフェースを提供しています。例えば、size(), at(), front(), back()などがあります。

例

以下は、...を使用したstd::array簡単な例です。出力結果を含みます。

例

#include <iostream>
#include <array>

int main() {
    // 5つの整数を含む std::array を作成
    std::array<int, 5> myArray = {1, 2, 3, 4, 5};

    // 範囲 for ループを使用して配列を走査
    for (const auto& value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    // インデックスを使用して配列要素にアクセス
    std::cout << "Element at index 2: " << myArray.at(2) << std::endl;

    // 配列のサイズを取得
    std::cout << "Array size: " << myArray.size() << std::endl;

    // 配列要素を変更
    myArray[3] = 10;

    // 変更後の要素を表示するために配列を再度走査
    for (const auto& value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

出力結果:

1 2 3 4 5 
Element at index 2: 3
Array size: 5
1 2 3 10 5 

一般的なメンバ関数

以下は、<array>内の一般的なメンバ関数の一部です。

関数 説明
at(size_t pos) 指定された位置の要素を返します(境界チェック付き)
operator[] 指定された位置の要素を返します(境界チェックなし)
front() 配列の最初の要素を返します
back() 配列の最後の要素を返します
data() 配列データを指すポインタを返します
size() 配列のサイズを返します(固定)
fill(const T& value) 配列のすべての要素を指定された値に設定します
swap(array& other) 2つの配列の内容を交換します
begin() / end() 配列の先頭/末尾のイテレータを返します

例

1、基本操作

例

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    std::cout << "Array elements: ";
    for (int i = 0; i < arr.size(); ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // 最初と最後の要素を取得
    std::cout << "First element: " << arr.front() << std::endl;
    std::cout << "Last element: " << arr.back() << std::endl;

    return 0;
}

at と境界チェックの使用

例

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr = {1, 2, 3};

    try {
        std::cout << arr.at(2) << std::endl;  // 正常な出力
        std::cout << arr.at(5) << std::endl;  // 範囲外のため、例外をスロー
    } catch (const std::out_of_range& e) {
        std::cout << "Exception: " << e.what() << std::endl;
    }

    return 0;
}

3、fill を使用して要素を埋める

例

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr;
    arr.fill(100);  // すべての要素を100に設定

    std::cout << "Filled array: ";
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

4、配列の交換

例

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr1 = {1, 2, 3};
    std::array<int, 3> arr2 = {4, 5, 6};

    arr1.swap(arr2);

    std::cout << "Array 1: ";
    for (const auto& elem : arr1) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    std::cout << "Array 2: ";
    for (const auto& elem : arr2) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

他の配列型との比較

特性std::arrayC スタイル配列std::vector
サイズコンパイル時に固定コンパイル時に固定動的に変更可能
境界チェックat()境界チェックを提供无at()境界チェックを提供
メモリ管理スタック上に割り当てスタック上に割り当てヒープ上に割り当て
パフォーマンス高効率高効率低め(動的割り当て)
インターフェースSTL 標準インターフェースをサポートSTL 標準インターフェースをサポートしないSTL 標準インターフェースをサポート

std::arrayこれは、C++ 標準ライブラリの中でも非常に便利なコンテナであり、固定サイズの配列を提供し、型安全性とメモリ管理の利点を持っています。上記の例を通じて、どのように作成、アクセス、および変更するかを確認できます。std::arrayの要素。std::arrayこれは非常に良い選択肢です。

その他の拡張