c++随机打乱数组_C++ Lesson 2:向量、迭代器和数组

c3a23491044f1d7e2816aba4f38f2d11.png

向量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的向量——不指定具体的值就是全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

结果为

7c14fd00bc4343109baacc5a6411e8e8.png
  • 使用Vector生成高维数组
#include

结果都是2*4的全0矩阵。

af1174f586e7a8c8c0376f5b1274fa49.png

五、数据在函数中的传递[1]

  • 将main函数中定义的数组,传递到子函数中,有一定的技巧。
  • 下图是一个例子

da4f09c3b93e0652dc26c7a53a07effc.png
  • 首先,定义子函数的传递形式,不仅仅传递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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值