std::array
定義於標頭檔案 <array> |
||
template< class T, |
(C++11 起) | |
std::array
是一個封裝了固定大小陣列的容器。
此容器是一個聚合型別,其語義等同於一個保有一個 C 風格陣列 T[N] 作為其唯一非靜態資料成員的結構體。與 C 風格陣列不同,它不會自動退化成 T*。作為一個聚合型別,它可以用聚合初始化,給予最多 N
個可轉換到 T
的初始化器進行初始化:std::array<int, 3> a = {1, 2, 3};。
該結構體結合了 C 風格陣列的效能和可訪問性以及標準容器的優點,例如知曉自身大小、支援賦值、隨機訪問迭代器等。
std::array
滿足容器 (Container) 和可逆容器 (ReversibleContainer) 的要求,除了預設構造的 array 不為空以及交換的複雜度是線性的,滿足連續容器 (ContiguousContainer) 的要求,(C++17 起) 並且部分滿足序列容器 (SequenceContainer) 的要求。
對於零長度陣列(N == 0
)有一個特殊情況。在這種情況下,array.begin() == array.end(),它是一個唯一的某個值。在零大小的 array 上呼叫 front() 或 back() 的效果是未定義的。
一個 array 也可以用作一個包含 N
個相同型別元素的元組。
目錄 |
[編輯] 迭代器失效
通常情況下,指向 array 的迭代器在 array 的整個生命週期內永遠不會失效。但需要注意,在交換操作期間,迭代器將繼續指向相同的陣列元素,因此其值會發生改變。
[編輯] 模板引數
T | - | 元素型別。必須是可移動構造 (MoveConstructible) 和可移動賦值 (MoveAssignable) 的。 |
N | - | 陣列中元素的數量,或為 0。 |
本節不完整 原因:完成模板引數的描述。 |
[編輯] 成員型別
成員型別 | 定義 | ||||||
value_type
|
T | ||||||
size_type
|
std::size_t | ||||||
difference_type
|
std::ptrdiff_t | ||||||
reference
|
value_type& | ||||||
const_reference
|
const value_type& | ||||||
pointer
|
value_type* | ||||||
const_pointer
|
const value_type* | ||||||
iterator
|
| ||||||
const_iterator
|
| ||||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[編輯] 成員函式
隱式定義的成員函式 | |
(建構函式) (隱式宣告) |
遵循聚合初始化規則初始化陣列(注意,對於非類型別的 T ,預設初始化可能導致不確定的值)(公開成員函式) |
(解構函式) (隱式宣告) |
銷燬陣列的每個元素 (公開成員函式) |
operator= (隱式宣告) |
用另一個數組的對應元素覆寫陣列的每個元素 (公開成員函式) |
元素訪問 | |
訪問指定的元素,帶邊界檢查 (公開成員函式) | |
訪問指定的元素 (公開成員函式) | |
訪問第一個元素 (公開成員函式) | |
訪問最後一個元素 (公開成員函式) | |
直接訪問底層連續儲存 (公開成員函式) | |
迭代器 | |
返回指向起始的迭代器 (公開成員函式) | |
返回指向末尾的迭代器 (公開成員函式) | |
返回指向起始的逆向迭代器 (公開成員函式) | |
返回指向末尾的逆向迭代器 (公開成員函式) | |
容量 | |
檢查容器是否為空 (公開成員函式) | |
返回元素數量 (公開成員函式) | |
返回元素的最大可能數量 (公開成員函式) | |
操作 | |
用指定值填充容器 (公開成員函式) | |
交換內容 (公開成員函式) |
[編輯] 非成員函式
(C++11 起)(C++11 起)(C++20 中移除)(C++11 起)(C++20 中移除)(C++11 起)(C++20 中移除)(C++11 起)(C++20 中移除)(C++11 起)(C++20 中移除)(C++20 起) |
按字典序比較兩個 array 的值(函式模板) |
(C++11) |
訪問 array 的一個元素(函式模板) |
(C++11) |
特化 std::swap 演算法 (函式模板) |
(C++20) |
從一個內建陣列建立一個 std::array 物件(函式模板) |
[編輯] 輔助類
(C++11) |
獲得 array 的大小(類模板特化) |
獲得 array 元素的型別(類模板特化) |
推導指引 |
(C++17 起) |
[編輯] 示例
#include <algorithm> #include <array> #include <iostream> #include <iterator> #include <string> int main() { // Construction uses aggregate initialization std::array<int, 3> a1{{1, 2, 3}}; // Double-braces required in C++11 prior to // the CWG 1270 revision (not needed in C++11 // after the revision and in C++14 and beyond) std::array<int, 3> a2 = {1, 2, 3}; // Double braces never required after = // Container operations are supported std::sort(a1.begin(), a1.end()); std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // Ranged for loop is supported std::array<std::string, 2> a3{"E", "\u018E"}; for (const auto& s : a3) std::cout << s << ' '; std::cout << '\n'; // Deduction guide for array creation (since C++17) [[maybe_unused]] std::array a4{3.0, 1.0, 4.0}; // std::array<double, 3> // Behavior of unspecified elements is the same as with built-in arrays [[maybe_unused]] std::array<int, 2> a5; // No list init, a5[0] and a5[1] // are default initialized [[maybe_unused]] std::array<int, 2> a6{}; // List init, both elements are value // initialized, a6[0] = a6[1] = 0 [[maybe_unused]] std::array<int, 2> a7{1}; // List init, unspecified element is value // initialized, a7[0] = 1, a7[1] = 0 }
輸出
3 2 1 E Ǝ
[編輯] 參閱
(C++26) |
可變大小、固定容量、原地連續陣列 (類模板) |
可變大小的連續陣列 (類模板) | |
雙端佇列 (類模板) | |
(庫基礎 TS v2) |
建立一個 std::array 物件,其大小和可選的元素型別從引數中推導 (函式模板) |