bitset
在头文件#include
bitset<4> a;
支持下标从0开始,0在最后面
a[0]=1;a[2]=1;//a:0101
bitset可以进行的运算:
bitset<4> a,b;
a=a|b; a=a&b; a=a^b; a=b<<2; a=b>>3;//移位越过的自动舍弃
成员函数:
count();//返回1的个数
bool test (size_t pos);//返回下标pos位是否为1
bool any();//只要有一位为1,返回true
bool none();//若全为0返回true
bool all();//若全为1返回true
set();//全部置1
set(pos);//第pos位置一
reset();//全部置0
reset(pos);//第pos位置1
flip();//全部取反
flip(pos);//pos位取反
.to_string();//转换为字符串
1,优先队列
包含在头文件#include
priority_queue
和队列基本操作相同:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
有两种形式:
priority_queue <int, vector<int>, greater<int> > q; //顶部是最小值
priority_queue <int, vector<int>, less<int> >q;//顶部是最大值
对于自定义类型:
struct node
{
int end, power;
bool operator < (const node& b)const
{
return power > b.power;
}
};
priority_queue<node> q; //根据node节点中的power值排序,顶部是最小值
将return power > b.power;中的符号改为 < 号则顶部是最大值
2,栈
头文件#include
形式stack
操作:
- s.push(item); //将item压入栈顶
- s.pop(); //删除栈顶的元素,但不会返回
- s.top(); //返回栈顶的元素,但不会删除
- s.size(); //返回栈中元素的个数
- s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
3,队列
头文件#include
形式queue
主要操作:
- q.push(item) //将item压入队列尾部
- q.pop() //删除队首元素,但不返回
- q.front() //返回队首元素,但不删除
- q.back() //返回队尾元素,但不删除
- q.size() //返回队列中元素的个数
- q.empty() //检查队列是否为空,如果为空返回true,否则返回false
4,动态数组
头文件#include
形式vector
常用操作:
- v1.push_back() //在数组的最后添加一个数据
- v1.pop_back() //去掉数组的最后一个数据
- v1.front() //返回第一个元素(栈顶元素)
- v1.begin() //得到数组头的指针,用迭代器接受
- v1.end() //得到数组的最后一个单元+1的指针,用迭代器接受
- v1.clear() // 移除容器中所有数据
- v1.empty() //判断容器是否为空
- v1.erase(pos) //删除pos位置的数据,pos是迭代器
- v1.erase(beg,end) // 删除[beg,end)区间的数据 ,两个都是是迭代器
- v1.size() //回容器中实际数据的个数
- v1.insert(pos,data) //在pos处插入数据
5,双端队列
头文件#include
主要形式: depue
主要操作:
- deq.assign(n,elem) //赋值n个元素的拷贝给双端队列
- deq.assign(beg,end) // 赋值一段迭代器的值给双端队列
- deq.push_front(elem) //添加一个元素在开头
- deq.push_back(elem) //添加一个元素在结尾
- deq.pop_front() //删除第一个元素
- deq.pop_back() //删除最后一个元素
- deq.at(index) //取固定位置的元素
- deq[index] //取固定位置的元素
- deq.front() //返回第一个元素(不检测容器是否为空)
- deq.back() //返回最后一个元素(不检测容器是否为空
6.双向链表
头文件#include
7,集合set
头文件 #include
set具备的两个特点:
set中的元素都是排序好的
set中的元素都是唯一的,没有重复的
set<int> s;
set<int>::iterator it; //迭代器
主要操作:
- begin(); // 返回指向第一个元素的迭代器
- end(); // 返回指向set的末尾的下一个位置的迭代器
- clear(); //清空set
- count(); //返回某个元素的数量(0或1)
- empty(); //判断set是否为空
- size(); //返回集合中元素的个数
- erase(); //删除集合中的元素,迭代器
- insert(); //在集合中插入元素
- lower_bound(x); //返回第一个(>=x)的元素的迭代器
- upper_bound(x); //返回第一个(>x)的元素的迭代器
- find(x); //返回x的迭代器,若没有则返回 s.end();
合并两个集合:
a.insert(b.begin(),b.end());
//set的遍历
set<int> s;
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++)
cout << *it << endl;
8,map
头文件:#include
它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,key必须是可以排序的数据结构
map内部数据是有序的,根据key值从小到大排序
map<key,value> m;
例如:
map<int, string> m;//将string映射到int
map<int, long long> m; //将long long映射到int
map<string,string> fa; //可以用来表示 字符串并查集
主要操作:
map的插入操作
m.insert(pair<int, string>(1, "str"));//使用insert函数插入pair类型数据
m[1099] = "wwww"; //用下标插入(下标为键值)
m[1] = "sssss"; //覆盖之前的
查找操作:
it = m.find(1);
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
删除操作:
erase(key);
m.erase(1);//删除键值为1的数据
int n = m.erase(1099);//如果删除成功饭返回1,否则返回0
主要操作:
- size(); //返回map的大小
- m.begin(); //返回第一个值的迭代器
- m.end(); //返回最后一个值的下一个迭代器
- m.clear(); //清空
- m.count(key); //因为key值不会重复出现,只会返回0,1
- m.empty(); //是否为空
- lower_bound(); //返回键值 >= 给定元素的第一个位置
- upper_bound(); //返回键值 > 给定元素的第一个位置
遍历
map<int, string>::iterator it;
for (it = m.begin(); it != m.end(); it++)
cout << it->second << " " << it->first << endl;
map做并查集
map<string,string> m;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话