C 標頭檔案系列 array

2021-07-26 00:00:23 字數 1582 閱讀 8761

注意,該標頭檔案僅在c++11中標準才開始出現。

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

那既然與內建陣列一樣,為什麼還要定義這樣乙個模版呢?c++委員會是想造輪子嗎(-_-)?當然不是!

array模版類實際上是內建陣列的聚合,外加一層封裝。正是由於這層介面,才使得陣列能與stl接軌,真正成為乙個container。

簡單通用的array介面,讓陣列使用起來更加得心應手。 例如size()成員函式返回陣列的大小,在內建陣列中則只能檢視陣列定義或者借助外部函式。

iterator作為c++中溝通algorithm與container的橋梁,起著不可或缺的作用。然而內建型別不支援迭代器的概念,雖然對於演算法來說有合適的過載能夠解決這個問題,但在語法上存在明顯的差別(vec為vector

for_each(vec.begin(), vec.end(), (int i)

);for_each(arr, arr + 3, (int i)

);

其實不需要變數定義宣告就可以猜到,vec是container而arr不是。 這也許會阻礙**後期的重構與修改。使用array類模版的話就不會存在這種問題,統一的語法,多棒!

我們都知道,c++沿襲了c語言的設計,在access陣列元素時不對陣列變數進行邊界檢查。array解決了這個問題,在元素讀寫越界時會丟擲異常。

array與內建陣列的乙個明顯的差異就是----允許空陣列的定義

至於為什麼要允許這樣乙個特性,也許是:

讓空陣列保持遍歷一致性

讓array容器隱式地支援清空(畢竟作為乙個fixed-size container,它沒有對應的clear操作)。

然而,空陣列在語義上是不允許解引用的,因此在使用時規避那些需要解引用的操作。

該方面的差異主要體現在swap成員函式上。就像我們知道的,其他容器呼叫swap函式時,為了保證高效,該函式實際上執行的操作相當於交換指向實際容器內容的指標。但是array的swap函式卻是進行逐成員交換,這也許是為了保持與內建陣列相同的性質----陣列位址不可變

出於上述語義上的差別,array與其他容器的迭代器,在swap後會有不同的結果(深色方框代表容器物件, 方框內文字代表容器內容; 箭頭代表迭代器變數, 都指向頭元素):

swap前:

swap後:

從圖上看更為直接:

array還提供了一套獨特的tuple介面,使其能夠像使用元組那樣使用。 當然,這種可能性的前提是它本身就非常像元組。

這種特性是通過過載tuple介面的get函式,並且特化tuple_element和tuple_size類模版實現的。

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...

C 標頭檔案系列 system error

報告源於作業系統或低層程式介面的錯誤。更進一步說,system error 提供了用於報告該方面錯誤的異常機制,是對的擴充套件。物以類聚,功能也以 類 分。剛看到這個標頭檔案的內容,我也有點懵逼,讓我們先理清類與類之間的關係 雖然這幾個類之間存在非常複雜的轉換構造關係 實際上error condit...