c++中的set容器介绍及操作大全

2025-06-25 05:50
文章标签 c++ 介绍 操作 set 大全 容器

本文主要是介绍c++中的set容器介绍及操作大全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...

​​一、核心特性

​唯一性与自动排序​
std::set存储的元素​​唯一且默认升序排列​​(通过std::less实现)。插入重复元素会被自动忽略:

set<int> s = {3, 1, 2, 2}; // 实际存储 {1, 2, 3}
  • ​底层实现​​:红黑树(自平衡二叉搜索树),保证插入、删除、查找的​​时间复杂度为O(log n)​

​元素不可修改​
元素值即键(Key),修改会破坏红黑树结构。迭代器类型为const_iterator,禁止写操作:

auto it = s.find(2);
*it = 4; // 编译错误!元素不可直接修改
  • http://www.chinasem.cn改的正确姿势​​:先删除旧值,再插入新值
  1. ​无随机访问​
    不支持operator[]或下标访问,遍历​​必须依赖迭代器​​(双向迭代器,仅支持++/--

️ ​​二、基本操作​​

​​1. 初始化与赋值​​

​方式​​示例​
默认构造set<int> s;
初始化列表set<int> s = {1, 3, 2}; → {1, 2, 3}
迭代器范围初始化vector<int> v{5,4,3}; s编程et<int> s(v.begin(), v.end());
自定义排序规则set<int, greater<int>> s;(降序)

4

12

​​2. 增删查操作​​

​操作​​函数​​示例​​返回值​
插入元素insert(value)s.insert(4);pair<iter, bool>(成功时bool=true
删除元素erase(key) / erase(iter)s.erase(3); 或 s.erase(s.begin());返回被删元素后的迭代器
查找元素find(key)auto it = s.find(2);找到返回迭代器,否则返回s.end()
统计元素存在性count(key)if (s.count(2)) { ... }01(因元素唯一)

1

9

​​3. 遍历方式​​

// 迭代器遍历
for (auto it = s.begin(); it != s.end(); ++it) {
    cout << *it << " ";
}
// 范围循环(C++11)
for (int val : s) {
    cout << val << " ";
}

⚙️ ​​三、高级操作​​

​​1. 自定义排序规则​​

通过函数对象或Lambda实现复杂排序:

struct CaseInsensitiveCompare {
    bool operator()(const string& a, const string& b) const {
        return tolower(a[0]) < tolower(b[0]); // 首字母不区分大小写
    }
};
set<string, CaseInsensitiveCompare> s;

​​2. 范围查询(lower_bound / upper_bound)​​

set<int> s = {10, 20, 30, 40};
auto low = s.lower_bound(20); // 首个 ≥20 的元素 → 20
auto high = s.upper_bound(30); // 首个 >30 的元素 → 40
  • ​应用场景​​:快速定位有序数据中的区间

​​3. 结构体存储​​

需重载operator<

struct Person {
    string name;
    int age;
    bool operator<(const Person& p) const { 
        return age < p.age; // 按年龄升序
    }
};
set<Person> s = {{"Alice", 30}, {"Bob", 25}};

⚖️ ​​四、性能对比:set vs vector​​

​操作​setvector​适用场景​
​插入/删除​O(log n)(任意位置)O(n)(非尾部操作)频繁中间插入/删除 → ​​选set
​查找​O(log n)(二分查找)O(n)(线性遍历)高频查找 → ​​选set
​随机访问​❌ 不支持✅ O(1)按索引访问 → ​​选vector
​内存占用​较高(树节点开销)较低(连续内存)内存敏感 → ​​选vector
​元素顺序​自动排序插入顺序需有序 → ​​选set

​关键结论​​:

  • ​唯一性+有序性​​需求优先选set
  • ​随机访问+连续存储​​需求优先选vector

​​五、典型应用场景​​

​数据去重与排序​
从重复数据中提取唯一有序序列:

vector<int> data = {5, 3, 5, 2, 1};
set<int> unique_sorted(data.begin(), data.end()); // {1, 2, 3, 5}

​高效存在性检查​
黑名单/白名单快速过滤:

set<string> blacklist = {"user1", "user2"};
if (blacklist.find(input_user) != blacklist.end()) block_user();

​范围统计与区间查询​
成绩分级、区间数据分析:

set<int> scores = {60, 75, 85, 90};
auto pass = scores.lower_bound(60); // ≥60的第一个元素

⚠️ ​​六、避坑指南​​

  • ​迭代器失效问题​

删除元素时,​​仅被删元素的迭代器失效​​,其他迭代器仍有效。

  • ​无android法修改元素值​

“修改”需先删除再插入:

auto it = s.find(old_val);
if (it != s.end()) 编程{
    s.erase(it);
    s.insert(new_val); // 安全修改
}
  • ​​自定义类型必须重载operator<​​
  • 否则编译失败(红黑树需比较规则)。

​总结​

  • ​核心优势​​:自动去重、有序存储、O(log n)高效操作;
  • ​核心局China编程限​​:无随机访问、内存开销较高;
  • ​替代方案​​:
    • 需重复元素 → multiset
    • 需O(1)查找 → unordered_set(哈希表实现,无序)。

到此这篇关于c++中的set容器介绍及操作大全的文章就介绍到这了,更多相关c++ set容器内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于c++中的set容器介绍及操作大全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155209

相关文章

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo