IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++之STL 工具 -> 正文阅读

[C++知识库]c++之STL 工具

本文介绍了一些在提高组中常用的 STL?工具

队列

STL?中提供的三种常用队列:queue,deque,priority_queue? ? ? ? ??

  1. ?queue(普通队列)
queue<int> q; //声明: queue<数据类型> 变量名

q.pop()    //将队首出队(队列为空时会RE)
q.push(x)  //把元素 x 入队
q.front()  //得到队首
q.size()   //返回队列大小(元素个数)
q.empty()  //判断队列是否为空,空返回true,否则返回false

? ? 2.? deque(双端队列)

deque<int> d;    //声明: deque<数据类型> 变量名

q.pop_front()    //将队首出队(队列为空时会RE)
q.pop_back()     //将队尾出队(队列为空时会RE)
q.push_front(x)  //将元素x从队首入队
q.push_back(x)   //将元素x从队首入队
q.front()        //得到队首
q.back()         //得到队尾
q.size()         //返回队列大小(元素个数)
q.empty()        //判断队列是否为空,空返回true,否则返回false

? ?3.? priority_queue(优先队列-堆)? 注意默认的为大根堆,小根堆可以取负数实现

priority_queue<int> d;   //声明: priority_queue<数据类型> 变量名

q.pop()                  //将堆顶出堆(堆为空时会RE)
q.push_front(x)          //将元素x入堆           
q.top()                  //得到堆顶
q.size()                 //返回堆大小(元素个数)
q.empty()                //判断堆是否为空,空返回true,否则返回false

?二分查找

? ? ?STL 中同样提供了二分查找的函数

  1. binary_search(起始地址,结束地址,查找元素);? 查找元素是否在数组中,为bool类型
  2. lower_bound(起始地址,结束地址,查找元素);? 返回数组中第一个大于等于该元素的地址
  3. upper_bound(起始地址,结束地址,查找元素);? 返回数组中第一个大于该元素的地址

?set

? ? ? set 是STL 中封装的一个集合,在log的时间内实现对元素的查找排序等,效率较高

set<int> s;            //声明:set<数据类型> 变量名
set<int>::iterator it; //set的迭代器

s.insert(x)  //在set中插入元素x
s.erase(x)   //若set中存在元素x,删除x
s.begin()    //返回第一个元素的地址
s.rbegin()   //返回最后一个元素的地址
s.end()      //返回set中的最后一个地址(没有真实值)
s.rend()     //返回第一个元素的地址(同s.begin())
s.size()     //返回set的大小
s.count(x)   //统计set中x的数量
s.clear()    //清空set
s.find(x)    //在set中查找第一个x的位置,返回地址,查找不到就返回s.end()
s.empty()    //判断set是否为空,空返回true,否则返回false
s.max_size() //返回set中最大能存元素的数目 
s.lower_bound(x) //在set中查找第一个大于等于x的元素,查找不到返回s.end()

? ?set会自动把元素去重,而multiset不会

map

? ??map是STL 提供的一个一对一映射的函数,在数组内自建一棵红黑树,可以用普通数组的方式? ? ? ? 访问(如mp[1]=1),类似哈希表等。

map<string,int> m; //声明:map<原来的类型,要映射的类型> 变量名
map<int,string>::iterator it;  //迭代器 

m.insert(pair<string,int>("qwq",1))  //用insert建立映射关系
m["qwq"]=1;                          //用数组的方式建立映射关系
m.size()                             //返回map的大小
for (it=m.begin();it!=m.end();it++)  //迭代器遍历map中的元素
for (int i=1;i<=m.size();i++)        //数组遍历map中的元素
m.erase(x)                           //删除关键字为x的元素
m.erase(it)                          //删除迭代器指向的位置

其他的操作与 STL-set 类似,详情可以看上面

vector

? ? ?STL? 中的一个向量

? ? 值得注意的是,vector 用数组访问时,只能访问以及赋值的元素

vector<int> v;            //声明:vector<数据类型> 变量名
vector<int>::iterator it  //迭代器

v.push_back(x) //在vector中插入元素x
v.begin()      //返回第一个元素的地址
v.end()        //返回vector中的最后一个地址(没有真实值)
v.size()       //返回vector的大小
v.count(x)     //统计vector中x的数量
v.find(x)      //在vector中查找第一个x的位置,返回地址,查找不到就返回v.end()

sort(v.begin(),v.end());                //对vector中的元素进行排序
reverse(v.begin(),v.end());             //翻转vector中的元素
copy(v1.begin(),v1.end(),v2.begin()+1); //把[v1.begin(),v1.end())的元素复制到v2中 
                                         (从v2.begin()+1开始,并且覆盖已有的元素)
find(v.begin(),v.end(),x);              //在[v1.begin(),v1.end())查找元素x

?list

? ? list 是STL中的一个链表结构

list<int> l();          //声明一个空链表l
list<int> l(n);         //声明一个大小为n的链表l
list<int> l(n,val);     //声明一个大小为n,元素全为val的链表l
list<int> l(l,r);       //声明一个列表l,其元素的初始值来源于由区间所指定的序列中的元素

基础操作与deque类似(l.front(),l.back(),l.pop_front(),l.push_front()等)

l.reverse(l.front(),l.back()) //把list进行翻转
l1.merge(l2,greater<int>());  //合并后升序排列(默认就是升序)

bitset?

? ? bitset是STL 提供的一个类似多位二进制数的容器

bitset<N> b;  //声明:bitset<大小> 变量名称

可以使用数组访问,但b[0]访问的是末尾元素,而不是首位(可以同个位理解)
b[x]=y          //对第x位赋值y
b.any()         //判断bitset是否存在值为1的二进制位
b.none()    	//判断bitset是否不存在值为1的二进制位
b.size()	    //返回bitset位长,也即是非模板参数值
b.count()	    //统计bitset值为1的个数
b.set()         //全部位 置1
b.reset()       //全部位 置0
b.set(pos)      //对pos位置1
b.reset(pos)    //对pos位置0
~b/b.flip()     //对bitset每位按位取反
b.flip(pos)     //把bitset的pos位取反

bitset 可以用 unsigned long long 与 string 的方式输出

总结?

? ? STL 的好用是众所周知的,但它的大常数常常会被卡,所以对与一些好写的 STL,可以选择手? ? ? 写,保证不超时(比如没有介绍到了stack,本来操作也不多,开个top和s[N]就可以搞定)

? ?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 11:49:20  更:2021-08-30 11:51:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 15:45:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码