C++容器之array的使用
阿新 • • 發佈:2021-05-14
文章目錄
C++容器之array的使用
在使用C-style-array時,會存在諸多的限制。例如,要時刻記住C-style_array的容量,以及它目前儲存了多少的元素,防止陣列角標越界。把陣列作為函式引數或返回值傳遞時更甚,作為函式引數傳遞,還要傳遞其容量,而作為返回值傳遞,其容量就成了問題。為此,C++提供了array類。
1.array類簡介
array類是C++標準庫中定義的容器類,其底層由一個數組實現,並提供了迭代器介面。
(1).array類的定義
要使用array,必須包含標頭檔案 <array>。該型別定義如下
namespace std {
template <typename T, size_t N>
class array;
}
其中第一個模板引數T標識儲存的元素型別,模板引數N表示陣列的長度。
(2).array類的屬性
- array容器類序列式容器,底部使用連續的記憶體空間儲存資料。
- array允許對元素進行隨機訪問,其迭代器為隨機訪問迭代器。
- array的記憶體將在編譯期確定,且不會重新分配。
2.array的初始化操作
array提供多種初始化操作,以用來應對不同的初始化場景
// default建構函式
array<int, 100> c;
// copy(複製)建構函式
array<int, 100> c(c2);
array<int, 100> c = c2;
// move(移動)建構函式
array<int, 100> c(std::move(c2));
array<int, 100> c = std::move(c2));
// initiallist(初始化列表)建構函式
array<int, 5> c({1, 2, 3, 4, 5 });
array<int> c({1, 2, 3, 4, 5, 6, 7}); // 元素數量N = 7
array<int, 100> c = {1, 2, 3, 4, ..., 100};
注意:對於copy和move建構函式c2必須和c是同型的,同型即元素型別和數量必須相等。
3.array迭代器介面
array提供所有八種迭代器介面、以便對array進行元素訪問,他們分別是
iterator interface | return |
---|---|
begin | return iterator to beginning |
end | return iterator to next of end |
cbegin | return const_iterator to beginning |
cend | return const_iterator to next of end |
rbegin | return reverse_iterator to reverse begin |
rend | return reverse_iterator to reverse end |
crbegin | return const_reverse_iterator to reverse begin |
crend | return const_reverse_iterator to reverse end |
/************************************************************
* Copyright (C) 2021. All rights reserved.
* FileName: arraytest.cpp
* Author: JaronZou
* Date: 2021/5/12
* Description: Test of array
* Function List:
***********************************************************/
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 5> arr = {1, 2, 3, 4, 5};
array<int, 5>::iterator beg;
array<int, 5>::const_iterator cbeg;
array<int, 5>::const_reverse_iterator crbeg;
for(cbeg = arr.cbegin(); cbeg != arr.cend(); cbeg++) {
cout << *cbeg << ' ';
}
cout << endl;
for(crbeg = arr.crbegin(); crbeg != arr.crend(); crbeg++) {
cout << *crbeg << ' ';
}
cout << endl;
for(beg = arr.begin(); beg != arr.end(); beg++) {
*beg += 100;
}
for(cbeg = arr.cbegin(); cbeg != arr.cend(); cbeg++) {
cout << *cbeg << ' ';
}
cout << endl;
return 0;
}
程式輸出:
4.array的比較操作
array提供所有比較運算子,分別是>、<、>=、<=、==、!=,要使用比較運算子,要求兩個運算元是同型的。這些比較運算子並不常用。
array<int, 5> arr1 = {1, 2, 3, 4, 5};
array<int, 5> arr2 = {1, 2, 3, 4, 6};
array<int, 5> arr3 = {1, 2, 3, 4, 5};
arr1 > arr2; // true
arr1 == arr3; //true
5.array的元素訪問
除了使用迭代器array還提供四種元素訪問方式。
operation | result |
---|---|
c[idx] | 返回索引idx所指的元素 |
c.at(idx) | 返回索引c所指的元素(如果越界,丟擲異常) |
c.front() | 返回第一個元素 (不檢查元素是否存在) |
c.back() | 返回最後一個元素(不檢查元素是否存在) |
/************************************************************
* Copyright (C) 2021. All rights reserved.
* FileName: arraytest.cpp
* Author: JaronZou
* Date: 2021/5/12
* Description: Test of array
* Function List:
***********************************************************/
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 100> arr;
for(int i = 0; i < 100; i++) {
arr.at(i) = i;
}
cout << arr[50] << endl;
cout << "first number: " << arr.front() << endl;
cout << "last number: " << arr.back() << endl;
return 0;
}
程式輸出:
6.array的capacity(容量)和其他操作
array並不提供capacity操作,但提供了size()和empty()可以訪問當前容器內的元素數量
operation | result |
---|---|
empty | 返回當前array是否為空,等價於arr.size() == 0 |
size | 返回當前元素數量 |
max_size | 返回元素個數的最大可能值 |
fill | 以某一值val填滿array |
swap | 與另一同型array交換資料 |
/************************************************************
* Copyright (C) 2021. All rights reserved.
* FileName: arraytest.cpp
* Author: JaronZou
* Date: 2021/5/12
* Description: Test of array
* Function List:
***********************************************************/
#include <iostream>
#include <array>
using namespace std;
template<typename T, size_t len>
void print(const array<T, len>& arr) {
for(auto beg = arr.cbegin(); beg != arr.cend(); beg++) {
cout << *beg << ' ';
}
cout << endl;
}
int main() {
array<int, 5> arr1 = {1, 2, 3, 4, 5};
array<int, 5> arr2 = {6, 7, 8, 9, 10};
array<int, 5> arr3;
cout << "arr1 is empty: " << arr1.empty() << endl;
cout << "size of arr1: " << arr1.size() << endl;
cout << "arr1:";
print(arr1);
cout << "arr2:";
print(arr2);
arr1.swap(arr2);
cout << "swap arr1 and arr2" << endl;
cout << "arr1:";
print(arr1);
cout << "arr2:";
print(arr2);
arr3.fill(56);
cout << "arr3:";
print(arr3);
return 0;
}
程式輸出:
7.Tuple介面
由於array不儲存其capacity(容量),因此array不提供介面獲得其capacity。可以使用Tuple提供的介面獲得,但要使用這些介面,必須包含標頭檔案<tuple>
operation | result |
---|---|
std::tuple_size<array>::value | 返回array的容量 |
std::tuple_element<1, array>::type | 返回array所儲存的元素的型別 |
std::get<idx>(arr) | 等價於arr[idx] |
/************************************************************
* Copyright (C) 2021. All rights reserved.
* FileName: arraytest.cpp
* Author: JaronZou
* Date: 2021/5/12
* Description: Test of array
* Function List:
***********************************************************/
#include <iostream>
#include <array>
#include <tuple>
#include <string>
using namespace std;
template<typename T, size_t len>
void print(const array<T, len>& arr) {
for(auto beg = arr.cbegin(); beg != arr.cend(); beg++) {
cout << *beg << ' ';
}
cout << endl;
}
int main() {
array<string, 5> arr = {"Tom", "Jerry", "Jack", "Bruce", "Hunter"};
print(arr);
cout << "capacity of arr: "
<< tuple_size<decltype(arr)>::value << endl;
tuple_element<1, decltype(arr)>::type name;
name = get<4>(arr);
cout << "index:4, name:" << name << endl;
return 0;
}
程式輸出:
參考資料
- 《C++ 標準庫》