天天看點

c++随機打亂數組_C++ Lesson 2:向量、疊代器和數組

c++随機打亂數組_C++ Lesson 2:向量、疊代器和數組

向量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
           

結果為

c++随機打亂數組_C++ Lesson 2:向量、疊代器和數組
  • 使用Vector生成高維數組
#include
           

結果都是2*4的全0矩陣。

c++随機打亂數組_C++ Lesson 2:向量、疊代器和數組
五、資料在函數中的傳遞

[1]

  • 将main函數中定義的數組,傳遞到子函數中,有一定的技巧。
  • 下圖是一個例子
c++随機打亂數組_C++ Lesson 2:向量、疊代器和數組
  • 首先,定義子函數的傳遞形式,不僅僅傳遞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

參考

  1. ^https://www.geeksforgeeks.org/how-arrays-are-passed-to-functions-in-cc/

繼續閱讀