1. 程式人生 > >C++11:儘量使用std::array來代替陣列

C++11:儘量使用std::array來代替陣列

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 << " ";}