1. 程式人生 > >STL-array和內建陣列

STL-array和內建陣列

與c++語言內建的陣列一樣, array類模版支援幾乎所有內建陣列包含的特性:

標頭檔案#include"arrey"

  • 順序的(sequence)
  • 記憶體連續的(contiguous storage)
  • 固定大小的(fixed-size)
  • array::begin
  • array::end
  • array::cbegin
  • array::cend
  • array::rbegin
  • array::rend
  • array::crbegin
  • array::crend

    與其他容器的差異

    該方面的差異主要體現在swap成員函式上。其他容器呼叫swap函式時,為了保證高效,實際上執行的操作相當於交換指向實際容器內容的指標。但是array的swap函式卻是進行逐成員交換

    ,這也許是為了保持與內建陣列相同的性質----陣列地址不可變

    #include"iostream"
    #include"iterator"
    #include"array"
    using namespace std;
    
    //標準庫arrey:非類 型別容器,不提供記憶體管理,固定大小 標頭檔案"arrey"
    //包裝了內建陣列,固定大小容器所以不支援建構函式,與STL接軌,容器
    
    void array_operator()
    {
    	array<int, 10>a = {0,1,2,3,4,5,6,7,8,9};//定義一個數組,大小和型別
    	array<int, 10>b = { 0 };
    	array<int, 10>c;
    	array<int, 10>d;
    	array<int, 0>f;//支援空陣列
    	b = a;//支援賦值交換 
    	c = { 1,2,3,4,5,6,7,8,9,0 };//列表賦值
    	cout << c.front() << " "<<c.back()<<endl;
    
    	for (auto temp : b)//遍歷for範圍語句
    		cout << temp;
    	c.fill(9);//.fill
    	for (int i=0;i<c.size();i++)//for迴圈下標
    		cout << c[i];
    	d.swap(c);//陣列交換
    	for (auto iter = d.begin(); iter != d.end(); iter++)//迭代器
    		cout << *iter;
    	for (auto iter = a.rbegin(); iter != a.rend(); iter++)//迭代器倒序
    		cout << *iter;
    }
    
    //內建陣列 使用陣列的時候編譯器會把它轉換為指標
    //陣列名:指向陣列首元素的地址
    //指標也是迭代器 也可以取到尾後指標
    void pointer_end() {
    	int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
    	int *p = &a[10];//取尾後指標,不指向任意元素
    
    	for (int *b = a; b != p; b++)
    		cout << *b;
    	cout << endl;
    }
    //陣列不是類型別表準庫函式 begin end也是全域性函式
    void begin_end()
    {
    	int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
    	int *beg = begin(a);//返回首元素地址
    	int *last = end(a);//返回尾後指標
    	while (beg != last)
    		cout << *beg++;
    }
    //多維陣列:陣列的陣列
    //多維陣列下標引用 表示式下標維度比陣列維度比較小,則表示式結果給一個內層陣列的索引
    void arrey_index()
    {
    	int a[2][3] = { 1,2,3,4,5,6 };
    	int(&b)[3] = a[1];//b為包含3個整形元素陣列的引用
    	int *p = a[1];
    	for (auto c : b)
    		cout << c;
    	for (int i = 0; i < 3; i++)
    		cout << *p++;
    	for (int i = 0; i < 3; i++)
    		cout << *(a[1] + i);
    	for (auto &row : a)//對多維陣列使用for範圍語句,除了最內層for其他都用引用
    		for (auto &col : row)//若最外層不是&則,編譯器將row轉換為一個指標int*
    			cout << col;     //若是引用row指向一個長度為3的陣列,類似於int(&b)[3]
    
    }