vector用法详解
vector介绍:
1、vector 数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组。相当于顺序存储的线性表,寻找元素快!但是插入元素的时间却很大(list是一个双向链表,在同一个位置插入大量的数据是速度很快,但是查找的速度就会慢很多)
2、和普通数组一样可以通过下表索引来进行访问
3、相对其他动态序列容器,vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效!!!
4、vector动态数组 可用通过数组名进行直接赋值
5、缺点:当新元素插入时,这个数组需要重新分配以增加存储空间。其做法是,分配一个新的数组,然后将全部元素转移到这个数组。就时间而言,这是一个相对代价高的任务,因为每一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。(时间复杂度和空间复杂度相对而言较高)
Vector操作:
1、声明变量
#include<vector>//引入头文件 using namespace std;//其所在的命名空间 vector<int> vec; //声明一个int 型的向量 vector<int> vec1(4,1);//vec的内容为 1,1,1,1、 vector<int> vec2{1,2,3,4,5,6};//vec的内容为 1,2,3,4,5,6 vector<int> vec3(vec2);//声明并用tmp向量初始化vec向量 int arr[5] = {1,2,3,4,5,6}; vector<int> vec4(arr,arr+5);//将arr数组的元素用于初始化vec向量 vector<int> vec5(&arr[1],&arr[4]);//将arr[1]~arr[4]范围内的元素作为vec的初始值 //说明:当然不包括arr[4]元素,末尾指针都是值结束元素的下一个元素 //这个主要是为理和vec.end()指针统一
2、插入元素
1.vec.push_back(同类型量);作用是在vector的末尾插入新元素
2.insert()第一个参数为迭代器,作用为在迭代器前面插入新元素
3.assign(5,1)向vector中加入5个去,同时清楚掉以前的元素
//vec的内容为 1,2 vector<int> vec1; vec1.push_back(1); vec1.push_back(2); vector<int> vec2(vec1); vector<int>::iterator it; it = vec2.begin(); vec2.insert(it, 5);//在第一个元素前添加5 it = vec2.begin();//每当新加一个元素时内存重新分配所以要重新为迭代器分配指针 vec2.insert(it, 2, 6); vector<int> vec3(vec2); vec3.assign(2, 5);//清除所有元素只留两个
3、删除元素
1.pop_back()删除最后一个元素
2.erase(删除指定位置元素。其中参数要是指针便变量,比如 begain(),end()以及迭代器值,
vec.erase(vec.begin()+2);//删除第三个元素
3.clear()清除所有元素
4.empty()判断该数组是否为空
4、遍历数组
1.front()访问第一个元素(第一个元素的值而不是地址!begin()相反)
2.back()访问最后一个元素(第一个元素的值而不是地址!end()相反)
3.size()数组的元素个数
vector<int> a = {1,2,3,4,5}; //像数组一样以下表访问 for (int i = 0; i < a.size(); i++) { cout << a[i] << " "; } //以迭代器访问 vector<int>::iterator it; for (it = a.begin(); it != a.end(); i++) { cout << *it << " "; }
6、翻转和排序的遍历
vector<int>vec = { 1,2,3,4,5 }; reverse(vec.begin(), vec.end());//将元素翻转,即逆序排列 sort(vec.begin(), vec.end());//采用的是从小到大的排序 //如果想从小到大排序,可以采用上面的反转函数,也可以采用下面方法; bool Comp(const int &a, const int &b) { return a > b; } sort(vec, begin(), vec.end(), Comp);