C++11:儘量使用std::array來代替陣列
阿新 • • 發佈:2019-01-27
C++11後,標準庫引入了更現代化的陣列std::array,cppreference.com是這樣介紹的:
定義於標頭檔案 <array>
template<
class T,
std::size_t N
> struct array;
(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) 的要求。
一種特殊情況是 array ( N == 0 )。該情況下, array.begin() == array .end() ,
並擁有某個唯一值。在零長 array 上呼叫 front() 或 back() 的效應是未定義的。
array 亦可用作擁有 N 個同類型元素的元組。
簡單來說,std::array除了有傳統陣列支援隨機訪問、效率高、儲存大小固定等特點外,還支援迭代器訪問、獲取容量、獲得原始指標等高階功能。而且它還不會退化成指標T *給開發人員造成困惑。
用std::array後,可以更簡便地進行初始化、修改、遍歷,這裡有個例子:
std::array<int, 10> arr = {1,2,3,4,5,6,7,8,9,0};
std::for_each(arr.begin(), arr.end(), [](int &i){i++;});
for(auto i : arr){std::cout << i << " ";}