C++ <array> operator[] 演算子
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;
}
#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
コードの解説:
numbers[0]operator[] は最初の要素を返します10(インデックスは 0 から始まります)。numbers[4]operator[] は最後の要素を返します50(なぜならsize()size は 5 であり、有効インデックスは 0〜4 だからです)。- ループと
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;
}
#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;
}
#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;
}
#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>