如果需要線性、長度不變的資料容器,可以使用 array
,這需要包含 array
標頭檔:
#include <array>
技術上來說,array
是個類別模版(class template),不過使用上,只需要知道,array
可以裝載指定型態的資料。例如,建立長度為 5,可裝載 int
的 array<int, 5>
:
array<int, 5> number;
如同原生陣列,number
每個索引位址的初值是不可預期的,若想在建立容器時裝載指定的元素,可以使用清單初始化(list initialization)或者初始器(Initializer):
array<int, 3> id = {0}; // 全部初始為 0
array<int, 3> number = {10, 20, 30};
array<double, 3> score{85.5, 78.2, 63.0};
想要循序地走訪 array
中的元素,可以使用 for range 語法,例如:
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 3> number = {10, 20, 30};
for(auto n : number) {
cout << n << endl;
}
return 0;
}
透過 []
指定索引可以存取特定位置的元素,例如:
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 3> number = {10, 20, 30};
for(int i = 0; i < number.size(); i++) {
cout << number[i] << endl;
}
return 0;
}
可以從 array
的 size
方法得知元素的個數,empty
方法可以得知是否為空,front
方法可以取得第一個元素,back
方法可以取得最後一個元素,fill
方法可以將各元素內容設為指定值。
array
可以使用另一個 array
作為引數來建構,例如以 a1
作為引數來建構 a2
:
array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2(a1);
這會將 a1
的元素複製給被指定的 a2
;array
可以指定給另一 array
,這也會將 array
的元素複製給被指定的 array
,例如:
array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2 = a1;
若要指定來源 vector
的某個範圍建構出新的 vector
,必須指定起始位置的 iterator
與結束位置的iterator
,例如底下從索引 2 開始走訪至尾端的元素,用以建立新的 vector
:
vector<int> v1 = {10, 20, 30, 40, 50};
vector<int> v2(v1.begin() + 2, v1.end()); // 包含 30, 40, 50
array
具有 begin
與 end
方法,分別傳回起始位置的 array<int, LENGTH>::iterator
與結束位置的 array<int, LENGTH>::iterator
,可以把它們看成代表首個元素與最後一個元素的位置,對它們進行 +
或 -
運算,表示元素的位移量,操作上很像指標,至於是不是真的指標,要看底層的實作而定。
就 API 的設計來說,不建議將 begin
、end
方法的傳回值看成是指標,而建議將之看成迭代器(iterator),這些迭代器重載了相關的運算子,令其看來像是指標操作,因為容器相關的程式庫,為基於這類操作協定,令提供的 API 具有通用性。
若要使用迭代器來走訪元素,例如,先前的 for range 語法,若要使用 begin
與 end
方法,可以搭配 for
迴圈,例如:
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 3> number = {10, 20, 30};
for(array<int, 5>::iterator it = number.begin();
it != number.end();
it++) {
auto n = *it;
cout << n << endl;
}
return 0;
}
如果打算對 array
進行排序、尋找、反轉等操作,可以使用包含 algorithm
標頭檔:
#include <algorithm>
一些操作會使用到迭代器,例如下面這個程式直接示範了排序、尋找、反轉等操作:
#include <algorithm>
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 6> number = {30, 12, 55, 31, 98, 11};
// 排序
sort(number.begin(), number.end());
for(auto n : number) {
cout << n << " ";
}
cout << endl;
cout << "輸入搜尋值:";
int search = 0;
cin >> search;
array<int, 6>::iterator it = find(number.begin(), number.end(), search);
cout << (it != number.end() ? "找到" : "沒有")
<< "搜尋值"
<< endl;
// 反轉
reverse(number.begin(), number.end());
for(auto n : number) {
cout << n << " ";
}
cout << endl;
return 0;
}
執行結果:
11 12 30 31 55 98
輸入搜尋值:12
找到搜尋值
98 55 31 30 12 11