C++ STL set容器
一、set容器特性:和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。举个例子,如下有 2 组键值对数据:{<'a', 1>, <'b', 2>, <'c', 3>}、{<'a', 'a'>, <'b', 'b'>, <'c', 'c'>},set容器只能存储第二组键值对。
二、存储方式:基于 set 容器的这种特性,当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可。仍以存储上面第 2 组键值对为例,只需要为 set 容器提供 {'a','b','c'} ,该容器即可成功将它们存储起来。
三、排序:我们知道,map、multimap 容器都会自行根据键的大小对存储的键值对进行排序,set 容器也会如此,只不过 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。
四、使用限制:
1)使用 set 容器存储的各个元素的值必须各不相同。
2) 在正常情况下,用户是无法做到修改 set 容器中元素的值的。 最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。
五、创建:
1) 调用默认构造函数,创建空的 set 容器。比如:
- std::set<std::string> myset;
- 也可以直接set<int>s;
如果程序中已经默认指定了 std 命令空间,这里可以省略 std::。
由此就创建好了一个 set 容器,该容器采用默认的std::less<T>
规则,会对存储的 string 类型元素做升序排序。注意,由于 set 容器支持随时向内部添加新的元素,因此创建空 set 容器的方法是经常使用的。
2) 除此之外,set 类模板还支持在创建 set 容器的同时,对其进行初始化。例如:
- std::set<std::string> myset{"http://c.biancheng.net/java/",
- "http://c.biancheng.net/stl/",
- "http://c.biancheng.net/python/"};
由此即创建好了包含 3 个 string 元素的 myset 容器。由于其采用默认的 std::less<T> 规则,因此其内部存储 string 元素的顺序如下所示:
"http://c.biancheng.net/java/"
"http://c.biancheng.net/python/"
"http://c.biancheng.net/stl/"
3) set 类模板中还提供了拷贝(复制)构造函数,可以实现在创建新 set 容器的同时,将已有 set 容器中存储的所有元素全部复制到新 set 容器中。
例如,在第 2 种方式创建的 myset 容器的基础上,执行如下代码:
- std::set<std::string> copyset(myset);
- //等同于
- //std::set<std::string> copyset = myset
该行代码在创建 copyset 容器的基础上,还会将 myset 容器中存储的所有元素,全部复制给 copyset 容器一份。
六、常用函数:
begin()
end()
find(val):在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
insert()
erase()
swap():
count(val):在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)