STL學習筆記— —容器array
阿新 • • 發佈:2019-01-03
簡介
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