1. 程式人生 > >C++11新特性之 std::array container

C++11新特性之 std::array container

陣列每個人都很熟悉,vector更是我們常常用到的。

但是某些場合,使用vector是多餘的,尤其能明確元素個數的情況下,這樣我們就付出了效率稍低的代價!

但是你使用陣列的代價是那麼的不安全,那麼的不方便。

於是,C++11推出了模板類array,位於std名稱控制元件中。
與vector不同的是,array物件的長度是固定的,使用了靜態儲存區,即儲存在棧上,效率跟陣列相同,但是更加的安全。

首先需要包含標頭檔案array,而且語法與vector也有所不同:

#include<array>
...
std::array<int,5> ai;//建立一個有5個int成員的物件
std::array<double,4> ad = {1.2, 2.1, 3.1, 4.1};

順便提一嘴,C++11允許使用初始化列表對vetcor和array進行賦值,詳情請見部落格《 c++11特性之initializer_list

個人覺得array相比於陣列最大的優勢就是可以將一個array物件賦值給另一個array物件:

std::array<double, 4> ad = {1.2, 2.1, 3.1, 4.1};
std::array<double, 4> ad1;
ad1 = ad;

陣列索引越界也是我們往往躲不過的坑兒,array和vector使用中括號索引時也不會檢查索引值的正確性。

但是,他們有一個成員函式可以替代中括號進行索引,這樣越界就會進行檢查:

std::array<double, 4> ad = {1.2, 2.1, 3.1, 4.1};
ad[-2] = 0.5;//合法
ad.at(1) = 1.1;

使用at(),將在執行期間捕獲非法索引的,預設將程式中斷。

最後上一段程式碼:

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

int
main() { // construction uses aggregate initialization std::array<int, 5> i_array1{ {3, 4, 5, 1, 2} }; // double-braces required std::array<int, 5> i_array2 = {1, 2, 3, 4, 5}; // except after = std::array<std::string, 2> string_array = { {std::string("a"), "b"} }; std::cout << "Initial i_array1 : "; for(auto i: i_array1) std::cout << i << ' '; // container operations are supported std::sort(i_array1.begin(), i_array1.end()); std::cout << "\nsored i_array1 : "; for(auto i: i_array1) std::cout << i << ' '; std::cout << "\nInitial i_array2 : "; for(auto i: i_array2) std::cout << i << ' '; std::cout << "\nreversed i_array2 : "; std::reverse_copy(i_array2.begin(), i_array2.end(), std::ostream_iterator<int>(std::cout, " ")); // ranged for loop is supported std::cout << "\nstring_array : "; for(auto& s: string_array) std::cout << s << ' '; return 0; }