C++11 语法与 STL 容器详解(持续更新)
一、STL 容器
1. set
set 维护的为一个有序集合,其中元素按照大小关系排列.
定义方式如下:
std::set<int> s;
其中 int 为数据类型可替换,但替换的类型必须有定义 << 符号.
常用的操作如下:
①
s.begin() 返回指向集合 ss 第一个元素的指针,对应元素元素为 *s.begin(),注意若集合为空则 RE,请谨慎使用.
s.end() 返回集合 ss 的结尾指针,注意该指针不指向任何元素.
② s.clear() 表示清空集合 ss.
③ std::set<int>::iterator it; 表示定义一个集合类型的指针.
④ 遍历 set:
方法一(C++):
for ( std::set<int>::iterator it=s.begin();it!=s.end();it++ )
{
int x=*it;
}
注意:循环判定条件为 it!=s.end(),不可以写 it<s.end(). 同时移动指针应写为 it++ 而不是 it=it+1.
方法二(C++11):
for ( int x:s ) ;
注意:遍历的参数 xx 为 ss 当中元素的值.
⑤ s.empty() 若集合 ss 为空返回 true.
⑥ s.size() 返回集合 ss 中的元素个数,使用时需强制类型转换为 int 类型.
⑦ s.insert(x) 插入元素 xx,若集合中已存在 xx 则忽略.
⑧
s.erase(x) 删除元素 xx,若集合中不存在 xx 则 RE,因此需谨慎使用.
s.erase(it) 其中 itit 为上述定义的指针. 删除 itit 指向的元素,若不存在则 RE.
⑨
s.find(x) 返回一个指针,表示 xx 的位置,若不存在 xx 则返回 s.end().
s.lower_bound(x) 返回一个指针,表示第一个大于等于 xx 的数的位置. 若不存在则返回 s.end().
s.upper_bound(x) 返回一个指针,表示第一个大于 xx 的数的位置. 若不存在则返回 s.end().
⑩
s.count(x) 若集合 ss 包含 xx 则返回 true.
2. multiset
维护可重集合,大部分操作与 set 相同.
区别如下:
① s.size() 返回集合 ss 中的元素个数,注意同种元素会被算多次.
② s.insert(x) 插入元素 xx.
③
s.erase(x) 删除所有元素 xx.
s.erase(it) 删除 itit 指向的 xx,
④ s.count(x) 返回集合中 xx 的个数.
补充:
multiset 常用的删除一个元素 xx 的方法为先用 find() 找到该元素的指针,再 erase() 删去指针即可. 代码如下:
s.erase(s.find(x));
3. map
map 维护的是一个映射关系,简单来说就是一个下标类型任意的数组.
定义类似于 set 与 multiset:
std::map<int,int> f;
此处前一个 int 表示数组下标的类型,需定义 << 运算符,后一个 int 表示数组的值的类型,无要求.
常用操作如下:
① f[x] 返回 xx 对应的值(地址),与数组用法相同.
② f.count(x), f.clear(), f.size(), f.erase() 同 set 用法.
③ 由于 map 存的是一组映射关系,因此其中的每个元素为一个 pair 类型,即一对元素,所有返回的指针均为 pair 类型,使用方式如下:
p.first 表示返回 pair 类型 pp 的第一个元素,p.second 返回第二个元素. 对应到 map 有:
若定义 f[x]=y,则对应的指针为 (pair){x,y}.
其余大部分用法同 set.
上述三个 STL 容器的单次操作的效率均为 O(logn)O(logn) 级别(clear()为 O(1)O(1)),其中 nn 为元素个数. 具体实现采用红黑树的做法,常数较大,如遇到卡常题目不建议使用.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?