vector类似于数组,是采用连续内存的空间来存储元素。可以采用下标来对vector的元素进行访问,和数组一样高效。而且它克服了数组的缺点,可以动态的改变大小。
①头文件:
#include <vector>
②vector的初始化
vector<int> vec; //初始化
vector<int> vec(5); //声明一个大小为5的int向量
vector<int> vec(10, 1); //声明一个大小为10,全是1的向量
vector<int> tem(vec); //把vec的值赋给tem
vector<int> tmp(vec.begin(), vec.begin() + 3);//用向量vec的第0个到第2个值初始化tmp
vector<int> temp(vec.begin(), vec.end()); //整个vec都赋值进去
int arr[5] = { 1, 2, 3, 4, 5 };
vector<int> vec(arr, arr + 5);//将arr数组的元素初始化,+5是因为要把\0也赋值进去
vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
③容器的相关参数: size; empty; begin; end;
vector<int> vec(10, 1);
vec.at(1); //如果出现错误会抛出out of range ,比正常的遍历好一些
vec.size(); //容器的尺寸 这个尺寸指的是vector的长度而不是vector占用的空间大小
vec.max_size(); //容器可扩展的最大空间
vec.capacity(); //容器现在的大小 这个尺寸指的是空间的大小而不是长度
vec.empty(); //容器是否为空,空为1,不空为0
vec.begin(); //vector的头节点指针
vec.end(); //vector的尾节点指针
④ 修改: push_back(); pop_back; insert;erase; clear;
vector<int> vec(10, 1);
vec.push_back(2); //在结尾添加一个值,值直接写在里边
vec.pop_back(); //把末尾的值弹出去
vec.insert(vec.begin(), 123); //这里不能用下标来确定添加的位置,要用指针
vec.erase(vec.begin()); //每次删除一个数据
vec.erase(vec.begin(), vec.begin()+3); //删除0到3之间的数据
swap(vec[0], vec[1]); //交换一般使用这种方式
vec.clear(); //直接将这个vector清空
⑤元素遍历:两种方式遍历
for (int i = 0; i < vec.size(); i++)
cout << vec[i];
vector<int>::iterator it; //迭代器 或者用auto也行
for (it = vec.begin(); it < vec.end(); it++)
cout << *it;
⑥常用算法:
都需要使用 #include<algorithm>
reverse(vec.begin(), vec.end()); //倒叙排列
sort(vec.begin(), vec.end()); //升序排列,降序排列在倒序即可
⑦二维vector的用法(这个地方写的不对,还没有修改)
定义的时候是
vector< vector<int> > vec;
vector<vector<int> > vec(r, vector<int>(c, 0)); //全部初始化为0
使用的时候可以使用pushback、resize等函数修改其尺寸。
二维vector遍历时采用的方法是:
vec[x][y]这个和二维数组的检测方式是一致的。第一个大vector是一共有多少列,里边的小vector表示二维矩阵一共有多少行。
二维vector对应的习题有剑指Offer上的第四题:二维数组中的查找
牛客上的链接是:
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking