程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++11新特性之 std::array container

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

編輯:關於C++

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

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

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

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

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

#include
...
std::array ai;//創建一個有5個int成員的對象
std::array ad = {1.2, 2.1, 3.1, 4.1};

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

個人覺得array相比於數組最大的優勢就是可以將一個array對象賦值給另一個array對象:

std::array ad = {1.2, 2.1, 3.1, 4.1};
std::array ad1;
ad1 = ad;

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

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

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

使用at(),將在運行期間捕獲非法索引的,默認將程序中斷。

最後上一段代碼:

#include 
#include 
#include 
#include 
#include 

int main()
{
    // construction uses aggregate initialization
    std::array i_array1{ {3, 4, 5, 1, 2} };  // double-braces required
    std::array i_array2 = {1, 2, 3, 4, 5};   // except after =
    std::array 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 << 
sored i_array1 : ;
    for(auto i: i_array1)
        std::cout << i << ' ';

    std::cout << 
Initial i_array2 : ;
    for(auto i: i_array2)
        std::cout << i << ' ';

    std::cout << 
reversed i_array2 : ;
    std::reverse_copy(i_array2.begin(), i_array2.end(),
                      std::ostream_iterator(std::cout,  ));

    // ranged for loop is supported
    std::cout << 
string_array : ;
    for(auto& s: string_array)
        std::cout << s << ' ';

    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved