vector的初始化和使用

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 类型相同,也就是同为intvector类型,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{
privateint 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中的数组下标越界问题

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值