set 不允许重复元素,multiset 允许;两者均基于红黑树实现,自动排序,提供插入、删除、查找等高效操作,常用遍历方式为范围for循环。

在C++标准模板库(STL)中,set 和 multiset 是两个非常实用的关联式容器,它们基于红黑树实现,能够自动对元素进行排序,并提供高效的插入、删除和查找操作。虽然两者功能相似,但在处理重复元素方面存在关键差异。本文将详细讲解它们的用法、区别以及常见操作技巧。
set 与 multiset 的基本特性
set 是一个有序集合容器,其中每个元素都是唯一的,不允许重复值。它会自动按照升序排列元素(默认使用
multiset 与 set 基本相同,唯一的不同是允许存储重复元素。也就是说,同一个值可以出现多次,其他操作方式几乎一致。
常用头文件:
立即学习“C++免费学习笔记(深入)”;
#include
声明与初始化
定义 set 和 multiset 的语法如下:
std::set s; // 存储不重复整数的 set
std::multiset ms; // 可存储重复整数的 multiset
std::set names; // 字符串集合
支持初始化列表(C++11 起):
std::set s = {5, 2, 8, 2, 1}; // 实际内容为 {1,2,5,8},自动去重并排序
std::multiset ms = {5, 2, 8, 2, 1}; // 内容为 {1,2,2,5,8},保留重复项
插入与删除元素
使用 insert() 插入元素,erase() 删除元素。
插入示例:
s.insert(10);
s.insert({3, 7, 3}); // 插入多个值,重复的 3 不会被再次加入
insert 返回值:对于 set,返回 pair,bool 表示是否插入成功;multiset 总是插入成功,返回 iterator。
删除示例:
s.erase(5); // 删除值为 5 的元素
s.erase(it); // 删除指定迭代器指向的元素
s.erase(begin_it, end_it); // 删除范围内的元素
注意:erase 使用值删除时,会移除所有匹配项。在 multiset 中,这可能删除多个元素。
查找与遍历技巧
高效查找是 set/multiset 的强项。
find():查找指定值,返回迭代器。未找到则返回 end()。
auto it = s.find(3);
if (it != s.end()) { /* 找到了 */ }
count():统计某值出现次数。set 中只能是 0 或 1;multiset 可大于 1。
if (ms.count(2)) { /* 至少有一个 2 */ }
lower_bound(x):返回第一个 ≥ x 的元素位置。
upper_bound(x):返回第一个 > x 的元素位置。
equal_range(x):返回 pair,表示值 x 的范围 [first, second),只在 multiset 中有意义。
遍历方式(推荐使用范围 for):
for (const auto& val : s) {
std::cout
}
自定义比较规则
默认按升序排列,可通过仿函数或 lambda 自定义排序逻辑。
例如降序 set:
std::set> desc_set = {3, 1, 4, 1, 5}; // {5,4,3,1}
自定义结构体需提供比较函数:
struct Person {
std::string name;
int age;
};
struct Cmp {
bool operator()(const Person& a, const Person& b) const {
return a.age
}
};
std::set people;
去重与性能建议
如果需要自动去重且保持有序,优先选择 set。
若允许重复数据但仍需快速查找和有序访问,使用 multiset。
常见误区:
不要用 vector + sort + unique 实现去重逻辑,效率远低于 set频繁插入删除场景下,set 比排序数组更优大量只读查询可用 unordered_set 加手动排序替代,但失去自动排序优势
小技巧:从 multiset 构造 set 可实现快速去重:
std::set unique(ms.begin(), ms.end());
基本上就这些。合理利用 set 和 multiset,能让代码更简洁、高效。掌握它们的区别和核心操作,是提升 C++ 编程能力的重要一步。
以上就是C++ set和multiset用法详解_C++集合容器去重与查找技巧的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489422.html
微信扫一扫
支付宝扫一扫