最近由于在刷剑指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