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