1. 程式人生 > >STL學習筆記— —容器array

STL學習筆記— —容器array

簡介

array在標頭檔案<array> 中定義

namespace std
{
    template<class T, size_t N> 
    class array;
}

array是固定元素個數的容器,與相應C陣列的語義相同,容器array< T,N> 的大小等於相應C陣列T[N]的大小,且效能也與C陣列相同。但是它提供了C++標準容器的相應特性,如可以查詢容器大小,支援複製,支援隨機迭代器等等。不支援設定分配器。

這裡寫圖片描述

對於長度為0的std::array< T,0>存在一個特例。此時array.begin() == array.end(),且等於某個特定值。對這種array呼叫front()或back()的行為是未定義的。

array是一個簡單集合(沒有建構函式,也沒有私有或保護成員),同時也可以當作一個有N個相同型別元素的tuple。

陣列操作

構造、複製與析構

array<Elem,N> c //預設建構函式; 建立一個預設初始化的陣列

array<Elem,N> c(c2) //複製建構函式; 建立另一個與c2同型的vector副本(所有元素都被複制)

array<Elem,N> c = c2 //複製建構函式; 建立另一個與c2同型的vector副本(所有元素都被複制)

array<Elem,N> c(rv) //移動建構函式; 拿走右值rv的元素建立一個新的陣列
array<Elem,N> c = rv //移動建構函式; 拿走右值rv的元素建立一個新的陣列 array<Elem,N> c = initlist //使用初始化列表建立一個初始化的陣列

非變動性操作

c.empty() //判斷容器是否為空,與size()==0相同,但可能更快

c.size() //返回當前元素數量

c.max_size() //返回可容納的元素最大數量

c1 == c2 //判斷c1與c2是否相等

c1 != c2 //判斷c1與c2是否不相等,等同於!(c1==c2)

c1 < c2 //判斷c1是否小於c2

c1 > c2 //判斷c1是否大於c2
c1 <= c2 //判斷c1是否小於等於c2 c1 >= c2 //判斷c1是否大於等於c2

賦值

c = c2 //將c2所有元素賦值給c

c = rv //將右值物件rv的所有元素移動賦值給c

c.fill(val) //將val賦值給陣列c裡的每個元素

c1.swap(c2) //交換c1和c2的數

swap(c1,c2) //交換c1和c2的數

元素存取

c[idx] //返回索引idx所標示的元素,不進行範圍檢查

c.at(idx) //返回索引idx所標示的元素,如果越界,丟擲range-error

c.front() //返回第一個元素,不檢查第一個元素是否存在

c.back() //返回最後一個元素,不檢查最後一個元素是否存在

迭代器相關函式

c.begin() //返回一個隨機存取迭代器,指向第一個元素

c.end() //返回一個隨機存取迭代器,指向最後一個元素

c.cbegin() //返回一個隨機存取常迭代器,指向第一個元素

c.cend() //返回一個隨機存取常迭代器,指向最後一個元素

c.rbegin() //返回一個逆向迭代器,指向逆向迭代的第一個元素

c.rend() //返回一個逆向迭代器,指向逆向迭代的最後一個元素

c.crbegin() //返回一個逆向常迭代器,指向逆向迭代的第一個元素

c.crend() //返回一個逆向常迭代器,指向逆向迭代的最後一個元素

栗子

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

using namespace std;
int main()
{
    // 使用列表初始化來構造
    array<int, 3> a1{{1,2,3}};    // C++11中需要使用雙重花括號
    array<int, 3> a2{1, 2, 3}; // C++14直接使用一層花括號即可
    array<std::string, 2> a3 = { {string("a"), "b"} };

    // 支援基本的容器操作
    sort(a1.begin(), a1.end());
    reverse_copy(a2.begin(), a2.end(), ostream_iterator<int>(cout, " "));

    // 支援範圍for
    for(auto& s: a3)
        cout << s << ends;
}

輸出

3 2 1 a b