vector的初始化和使用
前言
vector指向量,可以理解为“变长数组”,长度根据需要而自动改变的数组。有时会碰到普通数组会超过内存的情况,可以使用vector解决。
而且,vector可以用来以邻接表的方式存储图,可以解决当节点数太多,无法使用邻接矩阵,又害怕使用指针实现邻接表的时候,使用很简单。
提示:以下是本篇文章正文内容,下面案例可供参考
一、vector是什么?
vector是一种类模板,是一种顺序容器。顺序容器是按照是按照元素在标准库里边的顺序保存和访问的。
二、初始化
1.默认初始化
vector<int> ilist1; 默认初始化
vector
为空, size
为0,表明容器中没有元素,而且 capacity
也返回 0,意味着还没有分配内存空间。
这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。
2.初始为二维数组的形式
vector<vector<int> > name;
vector<typename> Arrayname[arraySize];
//区别是第二种的一维长度事先固定了。
初始化vector容器,类型为vector<int
>,相当于初始化一个二维数组
3.通过同类型的vector进行初始化
vector<int> ilist2(ilist);
vector<int> ilist2 = ilist;
这两种方式等价 ,ilist2
初始化为ilist
的拷贝,ilist
必须与ilist2
类型相同,也就是同为int
的vector
类型,ilist2
将具有和ilist
相同的容量和元素。
4.通过迭代器进行初始化
vector<int> ilist3(ilist.begin()+2,ilist.end()-1);
ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容,在本例中ilist3被初始化为
{3,4,5,6}`。
这种初始化方法特别适合于获取一个序列的子序列
。
5.带参数构造初始化
vector<int> ilist4(7);
vector<int> ilist5(7,3);
(1)默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。
当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
(2)指定值初始化,ilist5被初始化为包含7个值为3的int。
6.通过数组地址初始化
int a[5]={1,2,3,4,5}
vector<int> vec_i(a,a+5);
7.直接用{ }初始化
vector<int> vec={1,2,3,4,5,6,7,8,9}
三、vector的使用
3.1.vector常用的成员函数
#include<vector>
vector<int> arr;
arr.push_back(9);//在arr结尾插入数字9
arr.pop_back();//删除arr末尾最后一个项
arr.front();//arr的第一个项的值
arr.back();//arr的最后一个项的值
arr.begin();//arr的第一个项的指针
arr.end();//arr的最后一个项的指针
arr.size();//arr的实际长度
arr.erase(arr.begin(),arr.end());//删除从arr的第一个到最后一个项
arr.insert(arr.begin(),5);//在arr的头之前插入数字5
arr.insert(arr.begin(),6,5);//在arr的头之前插入6个5
arr.empty();//判断arr是否为空
arr.clear();//将arr清空
3.2.操作vector常用函数
#include<algorithm>
sort(arr.begin(),arr.end());
//对vector排序
stable_sort(arr.begin(),arr.end());
//对vector稳定排序
reverse(arr.begin(),arr.end());
//反转vector
vector<int>::iterator newend = unique(arr.begin(),arr.end());
//对arr去重,并把去重后的实际个数存在迭代器newend里面
arr.erase(newend,arr.end());
//把从newend到arr最后一项(即重复的数字)去除ces
3.3.vector容器的四种遍历方式
class A{
private:
int x;
int y;
}
vector<A a> vec;
//遍历方式1,采用迭代器
for (vector::iterator it = vec.begin(); it != ovec.end(); it++)
{
cout << (*it).x << endl;
cout << (*it).y << endl }
//遍历方式2,采用迭代器.并采用C++11新标准中的auto关键字
for (auto it = vec.begin(); it != vec.end();it++)
{
cout << (*it).x << endl;
cout << (*it).y << endl;
}
//遍历方式3,采用下标进行数据元素访问
for (size_t i = 0; i < vec.size(); i++)
{
cout << vec[i].x << endl;
cout << vec[i].y << endl;
}
//遍历方式4,采用C++11新标准中的auto关键字
for (auto i:vec)
{
cout << i.x << endl;
cout << i.y << endl;
}
3.4 关于二位数组的遍历问题
vector<vector<int>> result=s.levelOrder(root);
vector<vector<int>>::iterator it1;
vector<int>::iterator it2;
for ( it1 = result.begin(); it1 != result.end(); it1++)
{
for (it2=it1->begin();it2!=it1->end();it2++)
{
cout << "[" << *it2 << "]"<<" ";
}
cout << endl;
}
3.5关于反转二维数组(行反转和彻底反转)
(1)行反转
reverse(result.begin(),result.end());
[3]
[9] [20]
[15] [7]
reverse(result)之后
[15][7]
[9][20]
[3]
(2)彻底反转
for (it1 = result.begin(); it1 != result.end(); it1++)
{
reverse(it1->begin(),it1->end());
}
reverse(result)之后,彻底反转之后
[7] [15]
[20] [9]
[3]
总结
1、本篇文章对vector的初始化以及使用进行了总结,后续还会添加新的内容,回持续更新,把遇到的使用都写进去,仅仅为了以后查找方便和复习使用
2、尽量使用遍历方式1、2、4,可以避免遍历方式3中的数组下标越界问题