1. 程式人生 > 其它 >C++容器之array的使用

C++容器之array的使用

文章目錄

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 interfacereturn
beginreturn iterator to beginning
endreturn iterator to next of end
cbeginreturn const_iterator to beginning
cendreturn const_iterator to next of end
rbeginreturn reverse_iterator to reverse begin
rendreturn reverse_iterator to reverse end
crbeginreturn const_reverse_iterator to reverse begin
crendreturn 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還提供四種元素訪問方式。

operationresult
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()可以訪問當前容器內的元素數量

operationresult
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>

operationresult
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++ 標準庫》