目录
前言
如果你有什么问题,希望跟我能够一起交流,除了通过博客交流外,欢迎你加入我的QQ群,一起交流有关于机器学习、深度学习、计算机视觉有关内容。目前我并未确定具体的研究方向,所以现在 处于广泛涉猎阶段,希望我们能够一起沟通。下图是我的群二维码:
一、Vector数组简介
1、引入
在写C++代码的时候,经常会遇到Vector数组,特别是在学习OpenCV的时候,经常会碰到Vector数组。
2、Vector数组概念
在c++中,vector是一个十分有用的容器。那么,他是一个什么样的容器呢?
Vector(向量)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,Vector是一个能够存放任意类型的动态数组,它可以增加和压缩数据。
对于C++来说,vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
二、Vector数组用法
1、数组的初始化
1.构造函数
Vector数组初始化调用了构造函数,Vector数组构造函数主要有以下几个:
vector() // 创建一个空vector
vector(int nSize) // 创建一个vector, 元素个数为nSize
vector(int nSize, const t& t) // 创建一个vector,元素个数为nSize, 且值均为t
vector(const vector&) // 复制构造函数
vector(begin, end) // 复制[begin, end)区间内另一个数组的元素到vector中
2.常用初始化方式代码示例
1.不带参数的构造函数初始化
这种方式是默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。适用于元素个数未知,需要在程序中动态添加的情况。
#include<vector>
vector<int> vec1; //初始化一个size为0的vector
2.带参数的构造函数初始化
(1)默认值初始化
Vec2中将包含5个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此Vec2被初始化为包含5个0。当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
//初始化size,但每个元素值为默认值
vector<int> Vec2(5); //初始化了5个默认值为0的元素
(2)指定值初始化
Vec3被初始化为包含5个值为1的int。当程序运行初期元素大致数量可预知,而元素的值几乎相同时,可采用这种初始化方式。
//初始化size,并且设置初始值
vector<int> vec3(5,1); //初始化了5个值为1的元素
(3)复制构造函数初始化
复制构造函数有两种方式,这两种方式等价 ,后者初始化为前者的拷贝,两者类型必须相同,也就是同为int的vector类型,初始化后,两者具有相同的容量和元素,适用于两个数组类型相同时的重命名或数据传递等情况。
vector<int> vec4 = vec2;
vector<int> vec5(vec2)
(4)直接赋值初始化
初始化为列表中元素的拷贝,列表中元素必须与Vec6的元素类型相容,本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。
vector<int> Vec6 = { 1,2,3,0,4,5,6,7 };
vector<int> Vec7{ 1,2,3,0,4,5,6,7 };
3.通过insert初始化
用insert初始化Vector数组的方法有很多,废话不多说,用代码说话。
//insert初始化方式将同类型的迭代器对应的始末区间(左闭右开区间)内的值插入到vector中
vector<int> vec8;
//将vec2[0]~vec2[2]插入到vec8中,vec8.size()由0变为3
vec8.insert(vec8.begin(), vec2.begin(), vec2.begin() + 3);
//insert可以插入m个值为n的元素
//在vec8开始位置处插入6个6
vec8.insert(vec8.begin(), 6, 6);
//insert也可通过数组地址区间实现插入
int a[6] = { 6,6,6,6,6,6 };
vector<int> vec9;
//将a的所有元素插入到b中
vec9.insert(vec9.begin(), a, a + 7);
2、Vector的用法
相关用法,请看代码
//1.尾部插入及删除数字
vec2.push_back(1); //尾部插入元素
vec2.pop_back() //删除尾部元素
//2.使用下标访问元素,
cout << vec2[0] << endl; //记住下标是从0开始的。
//3.使用迭代器访问元素.
vector<int>::iterator it;
for (it = vec2.begin(); it != vec2.end(); it++)
cout << *it << endl;
//4.插入元素:
vec2.insert(vec2.begin() + i, a); //在第i + 1个元素前面插入a;
//5.删除元素:
vec2.erase(vec2.begin() + 2); //删除第3个元素
vec2.erase(vec2.begin() + i, vec2.end() + j); //删除区间[i, j - 1]; 区间从0开始
//6.求数组大小:
vec2.size();
//7.清空 :
vec2.clear();
3、Vector的算法
主要有两个算法,一个是逆序,一个是排序,其他算法我们都可以自己编写,把这两个算法分享给大家:
注意,sort函数要添加头文件:
#include<algorithm>
算法如下:
//1.将元素逆序
reverse(vec2.begin(), vec2.end()); //将元素翻转,即逆序排列!
//2.将元素排序
sort(vec2.begin(), vec2.end()); //(默认是按升序排列, 即从小到大).