vector、堆、栈、队列的使用

最近由于在刷剑指offer,所以频繁接触vector,之前也没有好好学,所以把一些学到的东西记录下来,以供自己复习,当然能帮到别人就最好不过了。

vector有很多好处,首先就是它是动态的,能改变大小,而且能存放各种类型的数据,还可以在尾部添加值,类似于链表的特性,简单来说,vector是一个能存放任意数据类型的动态数组,包含在头文件<vector>中,在这里插一句堆栈和队列,栈的头文件是<stack>,堆的头文件是<algorithm>,队列的头文件是<queue>,还有双向队列的头文件是<deque>,然后就是定义和一些操作函数。下面的例子以int类型为例,其他的都一样。

vector:

vector<int> vec,vec2;

vec.begin()//指向迭代器中第一个元素。   
vec.end()//指向迭代器中末端元素的下一个,指向一个不存在元素。          
vec.push_back(elem)     //在尾部加入一个数据。  
vec.pop_back()          //删除最后一个数据。  
vec.capacity()  //vector可用空间的大小。  
vec.size()//返回容器中数据个数。  
vec.empty() //判断容器是否为空。  
vec.front()     //传回第一个数据。  
vec.back()  //传回最后一个数据,不检查这个数据是否存在。  
vec.at(index)   //传回索引idx所指的数据,如果idx越界,抛出out_of_range。  
vec.clear() //移除容器中所有数据。  
vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。  
vec.erase(begin,end)    //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator  
vec.insert(position,elem)   //在pos位置插入一个elem拷贝,传回新数据位置。  
vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。  
vec.insert(position,begin,end)  //在pos位置插入在[beg,end)区间的数据,无返回值。 

assign() 对Vector中的元素赋值 
get_allocator() 返回vector的内存分配器 
vec.max_size() 返回Vector所能容纳元素的最大数量(上限) 
vec.rbegin() 返回Vector尾部的逆迭代器 
vec.rend() 返回Vector起始的逆迭代器 
vec.reserve() 设置Vector最小的元素容纳数量 
vec.resize() 改变Vector元素数量的大小 
 

swap() //交换两个Vector,用法vec.swap(vec2),vec和vec2交换,也就是vec中的所有元素到vec2中,vec2中的所有元素到vec中

关于这些函数的具体用法有个大神写的挺好的,建议有需要的朋友可以去看下   http://blog.csdn.net/lsn946803746/article/details/52174425

 

另外关于vector中数据的访问,可以就用数组的形式,比如vec[i]表示下标为i的元素,当然还可以用迭代器iterator,我会在后面的博客中介绍iterator的详细用法

如果想翻转整个vector的话,有两种办法,一种是C++提供的函数reverse(vec.begin(),vec.end());另一种就是头尾互换,头尾互换也有两种办法,一种是用C++提供的swap函数,swap(vec[i],vec[j]);另一种就是设置一个中间变量,然后交换,类似于temp=vec[i];vec[i]=vec[j];vec[j]=temp;

然后介绍一下上面用到的这两个非常好用的函数,swap和reverse,两个函数都在<algorithm>头文件中

swap:用于交换两个变量的值,以整型为例,int a=2,b=3;swap(a,b);

reverse:在指定的区间内翻转数组,这个功能真的极其好用,比如reverse(begin,end);这里要注意的是翻转的区间是[begin,end),是不包含end的,拿整型数组举个例子,int a[5]={1,2,3,4,5}; reverse(&a[0],&a[4]);翻转之后数组是{4,3,2,1,5},a[4]是5不在翻转区间。当然reverse还可以用来翻转vector,string,char类型的数组等。

 

stack:先进后出(FILO)

stack<int> stk;

stk.empty()     如果栈为空返回true,否则返回false;
stk.size()     返回栈内元素的大小;
stk.pop()      从栈顶弹出一个成员;
stk.push()     向栈内压入一个成员;
stk.top()      返回栈顶,但不删除成员;

 

queue:先进先出(FIFO)

queue<int> que;

que.empty()      如果队列为空返回true,否则返回false;
que.size()       返回队列内元素的大小;
que.pop()       从队列弹出一个成员;
que.push()       向队列压入一个成员;
que.front()      返回到队首,但不删除成员;
que.back()       返回到队尾,但不删除成员;

 

deque:两端都可快速插入和删除元素,但是存取和迭代器操作会比vector慢一些,因为内部存储不是一个连续的内存块。操作和 vector很相似。

deque<int> deq;

deq.empty()         如果队列为空返回true,否则返回false;
deq.size()       返回队列内元素的大小;
deq.pop_front()      从队列首部弹出一个成员;
deq.push_front()    从队列首部压入一个成员;
deq.pop_back()           从队列尾部弹出一个成员;
deq.push_back()         从队列尾部压入一个成员;
deq.clear()        清空队列;
deq.begin()       指向迭代器中第一个元素。
deq.end()            指向迭代器中末端元素的下一个,指向一个不存在元素。
deq.front()      返回到队首,但不删除成员,不检查元素是否存在;
deq.back()        返回到队尾,但不删除成员,不检查元素是否存在;

 

heap:

关于堆,堆并不是STL的组件,但是经常充当着底层实现结构,堆是一种完全二叉树,STL里面的堆操作一般只会用到以下几个函数:

make_heap();pop_heap();push_heap();sort_heap();

关于堆有两个大佬介绍的很清楚,有兴趣学习堆的朋友可以去看下大佬的博客:

传送门:http://blog.csdn.net/wscdylzjy/article/details/46711743

       http://blog.csdn.net/xiajun07061225/article/details/8553808

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值