天天看点

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/

继续阅读