stl中各种常用东西的使用

20 篇文章 0 订阅
7 篇文章 0 订阅

stl均要包含:using namespace std;

1.队列:

包含头文件#include<queue>

假如定义了一个结构体(可以换成数据类型)node(或者int之类的数据类型)

声明队列queue<node>q;

基本操作:

弹出队首q.pop();注意在非空情况下使用

获得队首的引用q.front(); 如node t;t=q.front(),注意在非空情况下使用

获得队尾的引用q.back(); 如node t;t=q.back(),注意在非空情况下使用

判断非空q.empty();空返回1

压入队列q.push(t);

获得大小q.size();

如果要遍历的话用迭代器什么的还是手写吧,stl的太麻烦了点

2.优先队列

包含包含头文件#include<queue>

声明priority_queue<node>q;注意这样声明是默认less<node>,如果是结构体要重载小于号,如果参数填的greater<node>,写成这样priority_queue<node,vector<node>,greater<node>>q,这样是要重载大于号,当然也可以换成cmp自己定义的一个比较函数

如:

struct node
{
    int priority;
    friend bool operator <(const node& x,const node& y)
   {
           return x.priority<y.priority;//这样就是大的先弹出
   }

};

priority_queue<node>q;

基本操作:

弹出队首q.pop();注意在非空情况下使用

获得队首的引用q.top(); 如node t;t=q.top(),注意在非空情况下使用

判断非空q.empty();空返回1

压入队列q.push(t);

获得大小q.size();

什么参数都没默认为最大堆

3.栈

包含包含头文件#include<stack>

声明:stack<node>q;

基本操作:

弹出栈首q.pop();注意在非空情况下使用

获得栈首的引用q.top(); 如node t;t=q.top(),注意在非空情况下使用

判断非空q.empty();空返回1;

压入栈q.push(t);

获得大小q.size();

4.双向队列

包含包含头文件#include<deque>

声明:deque<node>q;

基本操作:

弹出队首q.pop_front();注意在非空情况下使用

弹出队尾q.pop_back();注意在非空情况下使用

获得队首的引用q.front(); 如node t;t=q.front(),注意在非空情况下使用

获得队尾的引用q.back(); 如node t;t=q.back(),注意在非空情况下使用

判断非空q.empty();空返回1;

压入队尾q.push_back(t);

压入队首q.push_front(t);

获得大小q.size();

清除所有元素q.clear();

5.键值对map

数据大的时候有奇效

头文件 
#include   <map> 
定义 map<int,int>M; 
两个为任意类型,相当于映射

插入数据 
 M[1008611]  =1; 
查找数据和修改数据 
 (1)   int   i   =   my_Map["a"]; 
         M[2222]   = i; 
 (2)   M::iterator it; 
        M.find("b");  

 (3)M.count(key):由于map不包含重复的key,因此M.count(key)取值为0,或者1,表示是否包含。
 删除数据 
  (1)  M.erase(it); 
  迭代数据 
  for   (it=M.begin();it!=M.end();   +it)   {} 
  其它方法 
M.size()     返回元素数目 
M.empty()    判断是否为空 
M.clear()       清空所有元素 

可以直接进行赋值和比较:=,  >,  >=,   <,  <=,  != ,==等等 

6.vector动态数组||向量

头文件#include<vector>

创建对象:vector<int>v;(int可以修改成任意类型或者结构体)

尾部插入数字v.push_back(a);注意a为同类型

迭代器声明:vector<int>::iterator it;

中间插入数据:v.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

删除数据:v.erase(it);删除迭代器it

遍历迭代器:

vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
    cout<<*it<<endl;

it相当于指针

清空:v.clear();

向量大小:v.size();

1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(v.begin(),v.end());将元素翻转

(2)使用sort排序:需要头文件#include<algorithm>,

sort(v.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

定义排序比较函数:

bool cmp(const int &a,const int &b)
{
    return a>b;
}

调用时:sort(v.begin(),v.end(),cmp),这样就降序排序。

7.二分查找的知识:

iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。

还可以顺便排序,只要末尾加上个cmp函数就好了

now为当前数据的时候

it=upper_bound(v.begin(),v.end(),now,cmp);

如果cmp是升序排列

代表按照函数cmp的顺序排好序后二分查找大于now的第一个迭代器

8.关于stl堆的一些知识:

make_heap(a,a+n)a可以是任何类型的数组,用来建堆,不过如果不是基础类型的话就要重载小于号,基础类型不重载默认为最大堆,a[0]就为堆顶,a[n-1]为末尾

用push_heap(a,a+n)作用就是更新堆

pop_heap(a,a+n)作用是将堆顶移到堆的尾部就是a[n-1]处,其他地方保持堆的形状,这些东西如果不是堆就不能用

9.常用的字符串函数

包含文件:string.h

函数名: strstr!!神器,比KMP会慢上一些,最多复杂度n方,但是可以省去很多KMP的代码,偷懒必备
函数原型:extern char *strstr(char *str1, char *str2);
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。

如果没找到就会返回NULL

包含文件:string

函数名:substr

用法:

string s;s.substr(i,j)会返回一个s串中从i开始的j位的string类字符串

包含文件:string

函数名:find

用法:

string s1,s2;s1.find(s2)如果找到会返回该串的开始位置,没找到返回string::npos;

10.set的用法

set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。

set的各成员函数列表如下:

1. begin()--返回指向第一个元素的迭代器

2. clear()--清除所有元素

3. count()--返回某个值元素的个数

4. empty()--如果集合为空,返回true

5. end()--返回指向最后一个元素的迭代器

6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器

7. erase()--删除集合中的元素

8. find()--返回一个指向被查找到元素的迭代器

9. get_allocator()--返回集合的分配器

10. insert()--在集合中插入元素

11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

12. key_comp()--返回一个用于元素间值比较的函数

13. max_size()--返回集合能容纳的元素的最大限值

14. rbegin()--返回指向集合中最后一个元素的反向迭代器

15. rend()--返回指向集合中第一个元素的反向迭代器

16. size()--集合中元素的数目

17. swap()--交换两个集合变量

18. upper_bound()--返回大于某个值元素的迭代器

19. value_comp()--返回一个用于比较元素间的值的函数

对于结构体可以重载小于号使得按照要求来排序

11.链表list

不常用,基本手写,直接找博客吧就不总结了http://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值