『OI常用的c++STL容器及函数』

版权声明:随你转载,你开心就好(记得评论和注明出处哦) https://blog.csdn.net/Prasnip_/article/details/81131073

·vector
·queue
·priority_queue
·deque
·set
·map
·stack
·sort
·upper_bound,lower_bound,binary_search


<更新提示>

<第一次更新>


<正文>

vector

c++stl自带的不定长数组。
头文件:#include<vector>
定义:vector<type>name(定义type类型的vector)
常用函数:

#include<vector>
using namespace std;
int main()
{
    vector<int>v;
    v.reserver(n);//扩大容量为n 
    v.clear();//清空容器 
    v.erase(pos);//删除位置为pos的元素 
    v.erase(begin,end);//删除区间[begin,end)的所有元素 
    v[i];//访问第i个元素,用法与数组相同 
    v.front();//返回第一个元素 
    v.back();//返回最后一个元素 
    v.push_back(e);//在尾部添加元素e 
    v.pop_back();//移除最后一个元素 
} 

queue

c++stl自带队列。
头文件:#include<queue>
定义:queue<type>name(定义type类型的queue)
常用函数:

#include<queue>
using namespace std;
int main()
{
    queue<int>q;
    q.clear();//清空容器 
    q.erase(pos);//删除位置为pos的元素 
    q.erase(begin,end);//删除区间[begin,end)的元素 
    q.push(a);//将元素a加入队列 
    q.front();//返回队头元素的值 
    q.back();//返回队尾元素的值 
    q.size();//返回队列中的元素个数 
    q.empty();//返回队列是否为空 
} 

priority_queue

c++stl自带优先队列(堆)。
头文件:#include<queue>
定义:
priority_queue< type,vector<type>,less<type> >name(定义type类型的大根堆)
priority_queue< type,vector<type>,greater<type> >name(定义type类型的小根堆)
常用函数:

#include<queue>
#include<vector>
using namespace std;
int main()
{
    priority_queue< int,vector<int>,less<int> >q;
    q.clear();//清空容器 
    q.push(a);//将元素a加入堆
    q.top();//取出堆顶元素 
    q.pop();//弹出堆顶元素 
    q.empty();//返回堆是否为空 
    q.size();// 返回堆中元素个数 
} 

deque

c++stl自带的双端队列。
头文件:#include<deque>
定义:deque<type>name(定义type类型的deque)
常用函数:

#include<deque>
using namespace std;
int main()
{
    deque<int>d; 
    d[i];//访问第i元素,用法与数组相同
    d.clear();//清空容器 
    d.front();//返回第一个元素 
    d.back();//返回最后一个元素 
    d.pop_back();//弹出尾元素 
    d.pop_front();//弹出首元素 
    d.push_back();//加入尾元素 
    d.push_front();//加入首元素 
} 

set

c++stl自带的集合容器。
头文件:#include<set>
定义:
set< type,less<type> >name(内部升序排序的set)
set< type,greater<type> >name(内部降序排序的set)
常用函数:

#include<set>
using namespace std;
int main()
{
    set<int>s;
    s.count(t);//返回集合中元素t的个数 
    s.empty();//返回集合是否为空 
    s.size();//返回集合中元素的个数 
    s.insert(t);//插入元素t 
    s.insert(begin,end);//插入区间[begin,end)中的所有值 
    s.erase(pos);//删除位置为pos的元素 
    s.erase(begin,end);//删除区间[begin,end)的所有元素 
}

集合不允许重复的元素存在,而multiset允许重复的元素存在。其所有常用用法均与set相同。

map

c++stl自带的一种提供键与值一一对应的数据存储结构,类似于python的字典(dictionary)。
头文件:#include<bits/stdc++.h>
定义:map<key,value>name(定义键类型为key,值类型为value的map)
常用函数:

#include<map>
using namespace std;
int main()
{
    map<int,int>m;
    m[n];//访问map中键为n的元素,与数组相同 
    m.count(n);//返回map中键为n的元素个数 
    m.find(n);//返回指向键为3的迭代器,如果不存在,返回m.end() 
    m.empty();//返回map是否为空 
    m.size();//返回map中的元素个数 
    m.erase(e);//删除键为e的元素 
    m.insert(make_pair(key,value));//在map中加入键为key,值为value的元素 
}

map中同样不允许重复元素的存在,而multimap允许重复元素存在,其所有常用用法均与map相同。

stack

c++stl自带的栈容器。
头文件:#include<map>
定义:stack<type>name(定义type类型的stack)
常用函数:

#include<stack>
using namespace std;
int main()
{
    stack<int>s;
    s.size();//返回栈中元素个数 
    s.empty();//返回栈是否为空 
    s.clear();//清空栈 
    s.top();//返回栈顶 
    s.pop();//栈顶出栈 
    s.push(a);//将元素a加入队列 
}

sort

c++算法库自带的快排函数。
头文件:#include<algorithm>
用法:sort(begin,end,cmp)(对区间[begin,end)进行排序,若不传入参数cmp,使用默认的operator <进行排序,即升序,从小到大)
cmp函数的写法:

inline bool cmp(int a,int b)
{
    if(a>b)return true;else return false;
}

代码片是一个从大到小,降序cmp函数的写法。
cmp函数必须为bool类型,在形参中定义两个需要排序类型的参数。根据你需要的条件对形参进行判断,若返回true则形参中的第一个排在前面,若返回false则形参中的第二个排在前面。在sort排序时调用其作为第三个形参即可。

upper_bound,lower_bound,binary_search

这是三个c++stl自带的二分查找函数。
头文件:#include<algorithm>
用法:
upper_bound(begin,end,value)(返回有序区间[begin,end)中第一个大于value的元素位置,注意返回的时地址,如需使用要在调用后加上“-数组名”)
lower_bound(begin,end,value)(返回有序区间[begin,end)中第一个大于等于value的元素位置,注意返回的时地址,如需使用要在调用后加上“-数组名”)
binary_search(begin,end,value)(返回有序区间[begin,end)中是否存在value,不指明位置)
这三个函数都是在有序区间内使用的函数,原理时二分查找,时间复杂度为 O ( n l o g 2 n )

小结

这些都是OI竞赛中常用的c++stl自带函数或容器,能很好的帮助我们实现代码,需要我们灵活运用,成为我们的助手。并且这些函数和容器全部允许在noip中使用,需要我们很好的掌握。


<后记>


<废话>

猜你喜欢

转载自blog.csdn.net/Prasnip_/article/details/81131073