C++のarray

  • 2019 年 12 月 27 日
  • 筆記

題圖:NoCopy

字數:1187 | 1分鐘讀完我2小時的思考

C++の容器array

天的C++の容器vector我們聊了C++中的vector,也是我們目前為止遇到的第二個容器,之前還遇到過string,只是我們沒有說明它的容器屬性,後面講到容器時,一併補充。今天我們繼續聊另外一個序列化容器 —— array。

其實,array跟我們上篇提到的vector很類似,但是在定義的方式上有一些不同。

注意,此處的array並不是數組,C++中也有數組,而且跟C中的數組基本沒什麼區別,所以這系列的文章就忽略掉了。

那麼,我們先來看一下怎麼樣使用array。

使用array,首先需要在代碼中包含頭文件:

#include <array>  

由於array是標準庫裏面的類,所以需要指明命名空間:

using std:array;  

或直接在array前指明命名空間:

std::array..  

下面我們在看一下怎麼定義array對象。直接上示例代碼吧,

#include<array>  using std::array;  int main(){  	std::array<int, 3> a1{ {1, 2, 3} };    	std::array<int, 3> a2 = {1, 2, 3};  	std::array<std::string, 2> a3 = { std::string("a"), "b" };  }  

從上面的例子中,我們可以明顯看見array與vector定義的不同。array定義時需要指定容器的大小,且與容器中實際的元素個數匹配。其他基本與vector相同。與vector一樣,array也有元素訪問的一些操作,而且基本與vector一致,直接放上示例代碼吧:

//array Demo    #include <iostream>  #include <array>  using std::array;  int main()  {  	array<int, 4> arr1 = { 1, 2, 3, 4 };  	std::cout << arr1.at(2) << std::endl;  	std::cout << arr1[2] << std::endl;  	std::cout << arr1.front() << std::endl;  	std::cout << arr1.back() << std::endl;  	std::cout << arr1.data() << std::endl;  	std::cout << *arr1.data() << std::endl;    	return 0;  }  

看上面的代碼,是不是跟我們上一篇文章寫的vector一樣?

下面我們再看一下array的迭代器,還是先上代碼吧,很多時候,代碼顯得更加親切:

    ...  array<int, 4> arr1 = { 1, 2, 3, 4 };  for (auto i = arr1.begin(); i != arr1.end(); ++i)      std::cout << *i << std::endl;    for (auto i = arr1.cbegin(); i != arr1.cend(); ++i)      std::cout << *i << std::endl;    for (auto i = arr1.rbegin(); i != arr1.rend(); ++i)      std::cout << *i << std::endl;  ...  

上面我們可以看出前兩對迭代器跟vector的一樣,不再細說。這裡補充一下說rbegin,rend。其實,vector中也是有這兩對獲取迭代器的方法的,昨天文章遺漏了,正好今天補充一下。

rbegin與rend中的r其含義是reverse(反向的),這兩個方法其實就是返回反向的迭代器,所有rbegin其實就是獲取array的末尾迭代器,rend就是獲取array的其實迭代器,實現了逆向遍歷,這樣看來是不是操作array或者vector更加方便了呢?

除此以外,array也有容量相關的一些操作函數,還是先上代碼吧:

std::cout << arr1.empty() << std::endl;  std::cout << arr1.size() << std::endl;  std::cout << arr1.max_size() << std::endl;  

好像沒啥可說的,好了,今天就到這裡,別問,問就是沒啥可說的,簡單的技術,我就不想說太多,走走形式,顯得更完整