当前位置: 首页 > news >正文

C++容器set

C++容器set

  • 定义
  • 构造函数
    • 1、默认构造函数
    • 2、带比较函数的构造函数
    • 3、区间构造函数
    • 4、初始列表构造函数
    • 5、拷贝构造函数
    • 6、移动构造函数
  • 迭代器
  • 查找与计数
  • 修改函数
  • 其他

定义

std::set - cppreference.cn - C++参考手册

存储唯一的、经过排序的键(key)。set 内部通常基于平衡二叉搜索树(如红黑树)实现,这保证了高效的查找、插入和删除操作

  • 唯一性set 中的每个元素(键)都是唯一的。尝试插入一个已存在的值会失败,容器保持不变
  • 有序性:元素在容器中自动排序。默认按升序排列(使用 std::less
  • 键即值:在 set 中,元素本身就是键。它不存储键值对(那是 map 的功能)
  • 平衡树实现:通常使用红黑树,保证了 O(log n) 的时间复杂度
  • 不可变键:一旦元素插入 set,就不能直接修改其值,因为这会破坏排序。如果需要“修改”,必须先删除再插入新值

构造函数

1、默认构造函数

#include <iostream>
#include <set>
#include <random>using namespace std;int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 10);// 默认构造函数std::set<int> set1;for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

2、带比较函数的构造函数

int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 10);// 带比较函数构造函数std::set<int, std::greater<int>> set1;for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

3、区间构造函数

int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 100);std::array<int, 2>  arr1 = { 222,333 };// 区间构造函数std::set<int, std::greater<int>> set1(arr1.begin(), arr1.end());for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

4、初始列表构造函数

int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 100);// 初始列表构造函数std::set<int, std::greater<int>> set1 = { 1,3,8,1,5,78,5,6 };for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

5、拷贝构造函数

int main()
{system("chcp 65001");std::set<int, std::greater<int>> set2 = { 11,22,33 };// 拷贝构造函数std::set<int, std::greater<int>> set1(set2);cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

6、移动构造函数

int main()
{system("chcp 65001");std::set<int, std::greater<int>> set2 = { 11,22,33 };// 移动构造函数std::set<int, std::greater<int>> set1(std::move(set2));cout << "set2.size()-> " << set2.size() << endl;cout << "set2.empty()-> " << boolalpha << set2.empty() << endl;cout << "set1.size()-> " << set1.size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}
}

迭代器

函数描述
begin() / end()返回指向首元素和尾后位置的正向迭代器
rbegin() / rend()返回指向末元素和首前位置的反向迭代器
cbegin() / cend()返回常量正向迭代器
crbegin() / crend()返回常量反向迭代器
int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 100);std::set<int, std::greater<int>> set1;for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.max_size()-> " << set1.max_size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;for (auto it : set1){cout << "set1-> " << it << endl;}for (auto it = set1.begin(); it != set1.end(); it++){cout << "begin-end-> " << *it << endl;}for (auto it = set1.cbegin(); it != set1.cend(); it++){cout << "cbegin-cend-> " << *it << endl;}for (auto it = set1.rbegin(); it != set1.rend(); it++){cout << "rbegin-rend-> " << *it << endl;}for (auto it = set1.crbegin(); it != set1.crend(); it++){cout << "crbegin-crend-> " << *it << endl;}
}

查找与计数

函数描述
find(key)查找 key,返回指向它的迭代器;未找到返回 s.end()
count(key)返回 key 在 set 中的数量(0 或 1)
contains(key)(C++20) 检查 key 是否存在于 set 中,返回 bool
lower_bound(key)返回指向第一个不小于 key 的元素的迭代器
upper_bound(key)返回指向第一个大于 key 的元素的迭代器
equal_range(key)返回一个 std::pair,包含 lower_boundupper_bound 的结果
int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 100);std::set<int, std::greater<int>> set1 = { 1,2,3 };for (int i = 1; i < 10; i++){set1.insert(dis(gen));}cout << "set1.size()-> " << set1.size() << endl;cout << "set1.max_size()-> " << set1.max_size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;// 查找auto it = set1.find(2);if (it != set1.end()){cout << "set1.find(2)-> " << *it << endl;}// 计数		cout << "set1.count(2))-> " << set1.count(2) << endl;// 包含cout << "set1.contains(2))-> " << boolalpha << set1.contains(2) << endl;// lower_boundit = set1.lower_bound(2);if (it != set1.end()){cout << "set1.lower_bound(2)-> " << *it << endl;}// upper_boundit = set1.upper_bound(2);if (it != set1.end()){cout << "set1.upper_bound(2)-> " << *it << endl;}// equal_rangeauto pair = set1.equal_range(2);for (auto it = pair.first; it != pair.second; ++it) {std::cout << "equal_range-> " << *it << endl;}
}

修改函数

函数描述
insert(value)插入一个元素。返回 std::pair<iterator, bool>bool 表示是否插入成功
insert(hint, value)提供插入位置的提示 hint,可能提高效率
emplace(args...)就地构造一个元素并插入。返回 std::pair<iterator, bool>
erase(key)删除值为 key 的元素,返回删除的元素数量(0 或 1)
erase(it)删除迭代器 it 指向的元素
erase(first, last)删除范围 [first, last) 的元素
clear()删除所有元素
swap(other)与另一个 set 交换内容
int main()
{system("chcp 65001");std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1, 100);std::set<int, std::greater<int>> set1 = { 1,2,3 };for (int i = 1; i < 10; i++){set1.insert(dis(gen));}set1.emplace(123);cout << "set1.size()-> " << set1.size() << endl;cout << "set1.max_size()-> " << set1.max_size() << endl;cout << "set1.empty()-> " << boolalpha << set1.empty() << endl;// 删除set1.erase(1);set1.erase(set1.begin());set1.erase(set1.begin(), --set1.end());for (auto it : set1){cout << "set1-> " << it << endl;}set1.clear();
}

其他

操作时间复杂度
insert / emplaceO(log n)
erase (键)O(log n)
erase (迭代器)O(1) 摊销 (删除单个元素)
find / countO(log n)
lower_bound / upper_boundO(log n)
size / emptyO(1)
begin / endO(1)
http://www.dtcms.com/a/532340.html

相关文章:

  • 网站建设主机耗电量怎么写代码自己制作网站
  • 超越低功耗:TMS320C6000 DSP的能效架构设计与IoT节点部署实践
  • 西安网站开发工资首都之窗门户网站首页
  • 中药电商平台是什么?主要具有哪些创新特征与应用场景?
  • Python模块(Module)详解:从基础使用到工程化实践
  • DTD 属性详解
  • 随身WiFi助手
  • 安卓网络请求详解:Retrofit + OkHttp 高效通信方案
  • centos建设网站营销系统平台
  • 华为OD机试双机位A卷 - 统计差异值大于相似值二元组个数 (C++ Python JAVA JS GO)
  • bug:realsense-viewer 找不到已识别的设备
  • Mac安装VisualVM 2.2启动闪退
  • 在macOS上搭建C#集成开发环境指南
  • 郑州市城乡建设规划网站苏州园区两学一做网站
  • 音乐网站 模板手游app平台排行榜
  • vue通信加密解密完整方案实现
  • 大模型模板输出与优化技术指南
  • 2026蓝桥杯
  • 让我用一个非常通俗易懂的方式来解
  • 搞一个卖东西的网站怎么做婚庆网站开发计划书
  • 迅雷之家是迅雷做的网站吗学校网站建设的意义和应用
  • 织梦建站教程全集房山营销型网站制作开发
  • 非齐次方程解的结构与几何意义的探讨
  • 【YashanDB】单机版数据库升级测试
  • 张家口百度免费做网站可以做家装设计的网站
  • F-INR: Functional Tensor Decomposition for Implicit Neural Representations
  • 电容的串联、并联
  • 如何解决 pip install -e . 安装报错 后端不支持可编辑安装(PEP 660)问题
  • 工业和信息部网站备案基于python网站开发
  • 网站建设维护是啥意思自己怎么做网页