C++ <array> operator[] 演算子

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


array の要素にアクセスするすべての方法の中で、operator[]operator[] は最も一般的で直接的な方法であり、通常の配列にアクセスするのと同じです。

operator[]これはコンテナクラスの添え字演算子であり、指定された位置の要素を返すために使用されます。ただし、境界チェックは行いません。その使い方は通常の C 配列と完全に同じです。

operator[]これは配列のようなランダムアクセス機能を提供し、任意の位置の要素にすばやくアクセスすることを可能にします。

単語の解説: operator[]operator[] は添え字演算子であり、角括弧は配列アクセスの目印です。


基本構文とパラメータ

operator[]operator[] はコンテナクラスのメンバ関数であり、配列と同じように使用するだけです。

構文形式

reference operator[](size_type pos);
const_reference operator[](size_type pos) const;

パラメータの説明

  • パラメータ: pos
    • 型:size_type(符号なし整数型で、通常はsize_t)
    • 説明: アクセスする要素の位置(インデックス)。インデックスは 0 から始まり、最大有効インデックスはsize() - 1。

関数の説明

  • 戻り値: 指定された位置の要素の参照。コンテナが const コンテナの場合は、const 参照を返します。
  • 効果: 指定された位置の要素を返します。境界チェックは行われず、範囲外アクセスの結果は未定義です。
  • at() との違い: operator[]operator[] は境界チェックを行わないため、少し高速です;at()at() は境界チェックを行い、範囲外アクセスの場合は例外をスローします。

実例

簡単なものから複雑なものまでの一連の例を通して、operator[]operator[] の使い方を完全に理解しましょう。

例1:基本用法 - 要素へのアクセス

実例

#include <iostream>
#include <array>

int main() {
    // 1. array を作成して初期化する
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "arrayのサイズは: " << numbers.size() << std::endl;

    // 2. operator[] を使用して要素にアクセスする
    std::cout << "最初の要素 << numbers[0] << std::endl;
    std::cout << "2番目の要素 << numbers[1] << std::endl;
    std::cout << "3番目の要素 << numbers[2] << std::endl;
    std::cout << "最後の要素 << numbers[4] << std::endl;

    // 3. ループを使用してすべての要素にアクセスする
    std::cout << "すべての要素: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

期待される実行結果:

array的大小是: 5
第一个元素 [0]: 10
第二个元素 [1]: 20
第三个元素 [2]: 30
最后一个元素 [4]: 50
所有元素: 10 20 30 40 50

コードの解説:

  1. numbers[0]operator[] は最初の要素を返します10(インデックスは 0 から始まります)。
  2. numbers[4]operator[] は最後の要素を返します50(なぜならsize()size は 5 であり、有効インデックスは 0〜4 だからです)。
  3. ループとoperator[]operator[] を使用してすべての要素を走査でき、その使い方は C 配列と完全に同じです。

例2:要素の値を変更する

operator[]operator[] は参照を返すため、要素の値を変更するために使用できます。

実例

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> numbers = {10, 20, 30};

    std::cout << "変更前: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    // operator[] を使用して参照を取得し、要素を変更する
    numbers[0] = 100;
    numbers[1] = 200;
    numbers[2] = 300;

    std::cout << "変更後: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

期待される実行結果:

修改前: 10 20 30
修改后: 100 200 300

コードの解説:

  • numbers[0] = 100;参照を通じて最初の要素の値を変更しました。
  • これはoperator[]operator[] が変更可能な左辺値参照を返すことを示しています。

例3:範囲 for ループ

範囲 for ループを使用して array を走査できます。

実例

#include <iostream>
#include <array>
#include <string>

int main() {
    std::array<std::string, 3> names = {"Alice", "Bob", "Charlie"};

    std::cout << "すべての要素: ";
    for(const auto& name : names) {
        std::cout << name << " ";
    }
    std::cout << std::endl;

    return 0;
}

期待される実行結果:

所有元素: Alice Bob Charlie

コードの解説:

  • 範囲 for ループは array の要素にアクセスするための簡潔な方法です。
  • とoperator[]インデックス方式と比較すると、コードがより簡潔で読みやすくなります。

例4:ベクトルの内積を計算する

operator[] を使用してoperator[]ベクトル演算を実装します。

実例

#include <iostream>
#include <array>

// 2つのベクトルの内積を計算する
int dotProduct(const std::array<int, 3>& v1, const std::array<int, 3>& v2) {
    int result = 0;
    for(size_t i = 0; i < v1.size(); ++i) {
        result += v1[i] * v2[i];
    }
    return result;
}

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

    int result = dotProduct(v1, v2);

    std::cout << "ベクトル v1: ";
    for(size_t i = 0; i < v1.size(); ++i) {
        std::cout << v1[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "ベクトル v2: ";
    for(size_t i = 0; i < v2.size(); ++i) {
        std::cout << v2[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "内積: " << result << std::endl;
    // 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32

    return 0;
}

期待される実行結果:

向量 v1: 1 2 3
向量 v2: 4 5 6
点积: 32

コードの解説:

  • operator[] を使用すると、operator[]アルゴリズム内で array の要素にすばやくアクセスできます。
  • 内積の計算は、対応する位置の要素を掛け合わせて合計することです。

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

その他の拡張