最近整理了一下C++总常用的STL,由于匆忙,如有错误,欢迎指正。
关于优先队列,它的实现就是数据结构的大顶堆跟小顶堆,如有疑问可自行百度,不在做说明。
优先队列的基本用法跟队列没什么两样,不同的是queue的取队首元素为q.front()而priority_queue是q.top(),并且优先队列可以根据自定义来实现队列中元素的排序,其原理就是利用堆排序,其复杂度为O(logn)。
基本操作:
empty() 如果队列为空,则返回真
pop() 删除对顶元素,删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素,返回优先队列中有最高优先级的元素
声明方式:
priority_queue
priority_queue
自定义优先级:
struct cmp {
bool operator ()(int x, int y)
{
return x > y;
}
};
priority_queue
结构体声明方式:
typedef struct node
{
int x,y;
bool operator < (const node &a) const
{
return x < a.x;//其排序规则为x小的小
}
}node;
priority_queue
实例:
#include
using namespace std;
typedef struct node
{
int x,y;
bool operator < (const node &a) const
{
return x!=a.x?x q;
for(int i = 1;i <= 3;i++)
{
node t;
scanf("%d%d",&t.x,&t.y);
q.push(t);
}
while(!q.empty())
{
node t = q.top();
q.pop();
cout<
其实双端队列我更认为应该叫做双端栈(瞎起的名字),因为它像是一个两头的栈,它的原则是后进先出,而队列是先进先出
本操作:
push_back(x)/push_front(x)//把x压入后/前端
back()/front() //访问(不删除)后/前端元素
pop_back() pop_front() //删除后/前端元素
empty() //判断deque是否空
size() //返回deque的元素数量
clear() //清空deque
声明方式:
deque
实例:
#include
using namespace std;
#define ll long long
int main(){
deque q;
int t;
for(int i = 1;i <= 5;i++)
{
scanf("%d",&t);
if(t&1)
{
q.push_front(t);//从开始压入
}
else
{
q.push_back(t);//结尾压入
}
}
//迭代器查询
deque ::iterator it;
for(it=q.begin();it!=q.end();it++)
{
cout<<*it<
set容器是默认从小到大排序并且去重,还有个容器交multiset,此容器跟set一样,但是可以允许存在重复元素,其用法与set完全一致,所以不再补充。
基本操作:
begin() 返回set容器的第一个元素,注意返回的是地址,以下均是
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
rbegin 返回的值和end()相同
rend() 返回的值和rbegin()相同
count(int value) 查询某个键值出现的次数,但对于set来说,只能存在不重复的数,所以其值只可能是0或1
erase(iterator或者value) 删除定位器指向的值或者删除键值为value的值
find(value) 查找值为value的值如果不存在返回end,返回的也是地址
声明方式:
set
set
自定义优先级:
struct cmp
{
bool operator()(const int& x,const int& y) const
{
return x>y;
}
};
set
结构体声明方式:
typedef struct node
{
int x,y;
friend bool operator < (const node& a,const node& b)
{
return a.x < b.x;
}
bool operator < (const node& a)const
{
return x
//以上两种方法均可
}node;
set
实例:
#include
using namespace std;
#define ll long long
typedef struct node
{
int x,y;
/*friend bool operator < (const node& a,const node& b)
{
return a.x < b.x;
}*/
bool operator < (const node& a)const
{
return xy;
}
};
set s1;
set s2;
int main()
{
//迭代器
for(int i = 0;i < 10;i++)
{
int x;
cin>>x;
s1.insert(x);
}
set ::iterator it;
for(it = s1.begin();it != s1.end();it++)
{
cout<<*it<>t.x>>t.y;
s2.insert(t);
}
set ::iterator it;
for(it = s2.begin();it != s2.end();it++)
{
cout<<(*it).x<<" "<<(*it).y< > s1;
set ::iterator it1;
for(it1 = s1.begin();it1!=s1.end();it1++)
cout<<*it1<<" ";
cout<
C++中map容器提供一个键值对容器,同set一样,map与multimap差别仅仅在于multiple允许一个键对应多个值。
基本操作:
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
声明方式:
map
实例
#include
using namespace std;
#define ll long long
map mmp;
int main()
{
for(int i = 0;i < 5;i++)
{
string s;
cin>>s;
mmp[s]++;//下标
}
mmp.insert(pair("lgy",999));
//map插入有两中不同的方法,一种是insert另一种是直接利用下标进行插入,不同的是insert插入不会覆盖而利用下标可以覆盖。
cout< ::iterator it;
for(it = mmp.begin();it!=mmp.end();it++)
{
cout<<(*it).first<<" "<<(*it).second<
vector可以理解为就是数组的使用,但是它的好处是动态开辟空间,节约了空间
基本用法:
1.构造函数
vector():创建一个空vector
vector(int nSize):创建一个vector,元素个数为nSize
vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
vector(const vector&):复制构造函数
vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2.增加函数
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3.删除函数
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
4.遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素
6.大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量张红所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值
7.其他函数
void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
实例
#include
using namespace std;
#define ll long long
//vector 声明
vector v;
vector a(10,3);//声明大小为10,初始值为3,相当于一维数组
vector b[200];//声明大小为200的向量,相当于二维数组
int main()
{
v.push_back(10);
cout<<*v.begin()<<" "<>a[0];
cout<>x;
v.push_back(x);
s.insert(i);
}
vector ::iterator it;
for(it = v.begin();it!=v.end();it++)
cout<<*it<<" ";
cout<