
向量vector、疊代器iterator以及數組array是C++中儲存資料的重要容器。貫穿了很多算法的基礎,特别是要在中間儲存資料。啥都不說了,複習起來吧。。
主要内容:
- Vector向量
- 執行個體化,vector<type> vec1;
- 向量的操作
- 疊代器iterator
- 數組array
- 定義:int arr[] = {1,2,3}; int arr[4] = {1,2,3,4}
- 指針和數組:int *p=arr; *p=arr[0]; *(p+i)=arr[i]
- 高維數組
- int arr[2][3] = {{1,2,3}, {4,5,6}};
- vector<vector<int>> matx(2, vector<int>(4));
一、Vector向量
1、使用前聲明
#include
根據教材,vector是一個
類模闆,not類型。是以,生成vector的類的時候,需要指定
類型。2、執行個體化
- vector<int> v0;//不指派,v0就是個空空的容器。
- vector<int> v1{1,2,3,4,5}; //直接初始化具體元素。注意 花括号 , 清單初始化 。
- vector<vector<int>> matrx(N); //定義二維數組,先定義N行,再對每一行擴充為M維的向量;下面得到的就是5*6的“matrix”,且全0。
int
- vector<float> v2(10) ; //初始化長度為10、全部為 的向量——不指定具體的值就是全0。注意圓括号
- vector<double> v3(10, 3.0) ; //初始化長度為10、全部為 3.0 的向量。注意 圓括号,值初始化 。
- vectot<int> v4 = {1,2,3,4,5}; //等價于vector<int> v1{1,2,3,4,5}。
- vector<string> v5 = {"I", "am", "a", "student."}; //注意花括号。
但如果是通過
數組進行
初始化,那麼初始值非常随機:int v4[10] ; //裡面的初始值全部随機,not 0。
3、vector中添加元素
- 一般是生成空的向量,然後向裡面填數。
- vector.push_back(i),放到最後。
#include
4、其他操作
- v.size()傳回v的長度。
- v.resize(n),将v的長度轉化為n(如果n小于原始的長度,那麼隻截取前n個;如果n超過原始的長度,那麼增加的部分填充0)。注意是直接“v.resize(n)”;而不是“v1=v.resize(n)”。
- v.clear():将v清空,隻留下size=0的容器。
- v.pop_back():将v的最後一個元素删去。
- v.front():v的第一個元素。
- v.back():v的最後一個元素。
- vector<int>::iterator,疊代器。
- v.begin()和v.end() 傳回的是該項量的在開頭和結束的 指針 ,沒法輸出。這兩個一般和疊代器iterator一起使用。
- 第一個索引是v[0] , 最後一個索引是v[n-1] ;索引使用中括号[]。和python類似。
例子:各生成10萬個随機數,分别服從U(0,1),N(5,4)。計算樣本均值和方差。
#include
二、疊代器(iterator)
- 要通路容器以及關聯容器的元素,需要通過疊代器實作。疊代器是一個變量,相當于容器和操縱容器的算法之間的中介。疊代器能夠指向容器中的某個元素。
- 疊代器定義: container<type>::iterator name ; *name 表示疊代器指向的元素,通過 ++ 進行操作。 v.begin() 和 v.end() 控制疊代器的頭尾。
- 通常,使用 auto begin=v.begin(),以及auto end=v.end() 。
#include
三、數組(Array)
1、定義
- 來自C++自帶的傳統變量類型。
- 大小固定,一旦确定,不能夠删減 。
- int v[10]——10維的靜态數組,裡面的初始值随機給定,同時長度無法變化。
- int* v——動态數組,長度能夠變化,*是指針,這存的是位址。
- int v[3] = {1,2,3};
- int v[] = {1,2,3};
- int v[4] = {1,2} ; ——完整部分是{1,2,0,0,0},差別于v[10]不指派的話都是随機數。
- 元素 索引從0開始 , 到n-1結束 。和上面的vector以及python一樣。
- 數組的size: sizeof(v)/sizeof(*v)。
2、指針和數組
- 使用數組的時候,一般把它轉為指針。
- 指針是指向對象的位址,*p=&a。數組的每一個元素也是對象,對數組使用索引arr[i],能夠得到第i位置的元素。是以,對每一個元素使用“取位址符”,就能夠得到該元素的指針。
int
通過以上的指定,
*p指向v
第0個位置的元素。
3、指針也是疊代器
int
通過*p指向v的第0個位置,以及指定末尾元素*e = &v[7],然後++p就能夠周遊v所有元素。
#include
四、高維數組
- 和vector<vector<int>> matrx(M)類似,Array也能生成高維數組。索引是從0~(N-1)。
#include
結果為
- 使用Vector生成高維數組
#include
結果都是2*4的全0矩陣。
[1]
- 将main函數中定義的數組,傳遞到子函數中,有一定的技巧。
- 下圖是一個例子
- 首先,定義子函數的傳遞形式,不僅僅傳遞int arr[ ],而且還要傳遞數組的size,貌似沒法在子函數中使用sizeof求出數組的size;然後在main函數中,定義好數組arr,傳遞到子函數中,我們傳遞的是arr,沒有中括号。
- 冒泡排序法的例子:
#include
參考書籍:
C++程式設計/鄭莉,李超編著.——北京:機械工業出版社,2012.1.
C++ Primer中文版:第5版/(美)李普曼(Lippman, S.B.),(美)拉喬伊(Lajoie, J.),(美)默(Moo,B.E.)著:王剛,楊巨峰譯.——北京:機械工業出版社,2013.9
參考
- ^https://www.geeksforgeeks.org/how-arrays-are-passed-to-functions-in-cc/