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 ) ;

注意:遍历的参数 xxss 当中元素的.

⑤ 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 为元素个数. 具体实现采用红黑树的做法,常数较大,如遇到卡常题目不建议使用.

posted @   DTOI_RSY  阅读(479)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示