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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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::array | C スタイル配列 | std::vector |
|---|---|---|---|
| サイズ | コンパイル時に固定 | コンパイル時に固定 | 動的に変更可能 |
| 境界チェック | at()境界チェックを提供 | 无 | at()境界チェックを提供 |
| メモリ管理 | スタック上に割り当て | スタック上に割り当て | ヒープ上に割り当て |
| パフォーマンス | 高効率 | 高効率 | 低め(動的割り当て) |
| インターフェース | STL 標準インターフェースをサポート | STL 標準インターフェースをサポートしない | STL 標準インターフェースをサポート |
std::arrayこれは、C++ 標準ライブラリの中でも非常に便利なコンテナであり、固定サイズの配列を提供し、型安全性とメモリ管理の利点を持っています。上記の例を通じて、どのように作成、アクセス、および変更するかを確認できます。std::arrayの要素。std::arrayこれは非常に良い選択肢です。