STL用法 (set)

set:

set中的元素师唯一的,multiset中可以存在多个相同的。

set的头文件是#include<set>

set中的元素默认从小到大排序;

也可以这样定义;

int main()
{
    set<int,greater<int> >s1;//从大到小排序
    set<int,less<int> >s2;//从小到大排序
    s1.insert(3);
    s1.insert(2);
    s1.insert(7);
    set<int>::iterator it=s1.begin();//迭代器
    for(;it!=s1.end();it++)
        printf("%d ",*it);
    return 0;
}
set 中的二分:

int main()
{
    set<int>s1;
    s1.insert(3);
    s1.insert(2);
    s1.insert(7);
    s1.insert(9);
    s1.insert(5);
    set<int>::iterator it1,it2;
    it1=s1.lower_bound(5);//返回大于或等于5的地址
    it2=s1.upper_bound(5);//返回大于5的地址
    printf("%d\n",*it1);
    printf("%d\n",*it2);
    return 0;
}



**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### C++ STL `set` 的使用方法 #### 基本概念 `set` 是 C++ 标准模板库(STL)中的关联容器之一,用于存储唯一的键值集合。它内部实现通常基于红黑树结构,因此具有自动排序功能,并支持高效的查找、插入和删除操作。 --- #### 定义与初始化 可以通过多种方式定义并初始化一个 `set`: ```cpp #include <set> // 默认构造函数创建空集 std::set<int> s1; // 初始化列表构造 std::set<int> s2 = {1, 2, 3, 4}; // 复制构造 std::set<int> s3(s2); ``` 以上代码展示了如何通过默认构造函数、初始化列表以及复制构造函数来创建 `set`[^1]。 --- #### 插入元素 向 `set` 中插入新元素非常简单,重复的元素不会被插入成功: ```cpp s1.insert(5); // 单个元素插入 s1.insert({6, 7}); // 批量插入多个元素 ``` 如果需要自定义比较规则,则可以在声明时指定第二个参数作为比较器: ```cpp struct cmp { bool operator()(const int& a, const int& b) const { return a > b; // 自定义降序排列 } }; std::set<int, cmp> s_custom; for (int i = 1; i <= 10; ++i) { s_custom.insert(i); } for (auto elem : s_custom) { std::cout << elem << " "; } // 输出:10 9 8 ... 1 ``` 此部分说明了如何利用自定义比较器改变 `set` 的排序逻辑[^2]。 --- #### 遍历元素 遍历 `set` 可以采用迭代器或者范围循环的方式完成: ```cpp // 使用迭代器遍历 for (std::set<int>::iterator it = s2.begin(); it != s2.end(); ++it) { std::cout << *it << " "; } // 范围循环更简洁直观 for (const auto& elem : s2) { std::cout << elem << " "; } ``` 这两种方法均能有效访问 `set` 内部的所有数据项。 --- #### 查找元素 为了快速定位某个特定值是否存在於 `set` 当中,可调用成员函数 `find()` 或者关系运算符: ```cpp if (s2.find(3) != s2.end()) { std::cout << "Element found!" << std::endl; } bool exists = (s2.count(3) > 0); // count返回匹配数量,对于set来说要么是0要么是1 ``` 这里强调了两种不同的检测机制及其适用场景。 --- #### 删除元素 单个或批量移除目标对象可通过如下手段达成: ```cpp s2.erase(3); // 移除具体数值为3的节点 s2.erase(s2.begin()); // 利用迭代器指向的位置执行清除动作 s2.erase(s2.begin(), s2.upper_bound(5)); // 清理从起始到小于等于5之间的全部项目 ``` 特别注意的是,在某些情况下可能需要用到边界辅助工具如 `lower_bound` 和 `upper_bound` 来精确定位待处理区域[^3]。 --- #### 综合实例演示 下面给出一段综合运用上述特性的程序片段: ```cpp #include <iostream> #include <set> int main() { std::set<int> numbers = {10, 20, 30, 40, 50}; // 添加新数 numbers.insert(25); // 展示当前状态 std::cout << "Set content after insertion: "; for (const auto& num : numbers) { std::cout << num << " "; } // 寻找某值位置 if (numbers.find(25) != numbers.end()) { std::cout << "\nValue 25 is present." << std::endl; } // 删除区间内的所有条目 auto lower_it = numbers.lower_bound(20); auto upper_it = numbers.upper_bound(30); numbers.erase(lower_it, upper_it); std::cout << "After erasing range [20,30):"; for (const auto& num : numbers) { std::cout << num << " "; } return 0; } ``` 该例子充分体现了 `set` 在实际编码过程里的灵活性与强大能力。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值