【C++】关联存储结构容器-set(集合)详解
目录
一、基本概念
二、内部实现
三、常用操作
3.1 构造函数
3.2 插入操作
3.3 删除操作
3.4 查找操作
3.5 访问元素
3.6 容量操作
3.7 交换操作
四、特性
五、应用场景
结语
一、基本概念
set是C++标准模板库(STL)中的一种关联容器,它主要用于存储唯一且有序的元素。set容器不允许元素重复,并且会自动对元素进行排序。set的内部实现通常基于红黑树(一种自平衡二叉搜索树),这使得set的插入、删除和查找操作的时间复杂度都是O(log n)。
二、内部实现
set容器的内部实现基于红黑树,红黑树是一种自平衡的二叉搜索树,具有以下特性:
- 每个节点是红色或黑色。
- 根节点是黑色。
- 每个叶子节点(NIL节点,空节点)是黑色。
- 如果一个节点是红色的,则它的两个子节点都是黑色的。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些特性确保了红黑树在插入和删除操作后能够重新平衡,从而保持树的高度在对数级别,进而保证了set容器的高效性。
三、常用操作
set容器提供了丰富的成员函数来支持各种操作。
3.1 构造函数
set容器提供了多种构造函数,可以根据实际需求选择合适的构造函数来创建set对象。常见的构造函数包括:
- 默认构造函数:创建一个空的set对象。
#include <iostream>
#include <set>int main() {std::set<int> emptySet; // 使用默认构造函数创建一个空的set对象// 输出set的大小以验证其为空std::cout << "Size of emptySet: " << emptySet.size() << std::endl; // 输出应为0return 0;
}
- 初始化列表构造函数:通过初始化列表来创建set对象,并初始化元素。
#include <iostream>
#include <set>int main() {std::set<int> initListSet = {1, 2, 3, 4, 5}; // 使用初始化列表构造函数创建并初始化set对象// 遍历并输出set中的元素for (int num : initListSet) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
- 复制构造函数:创建一个新的set对象,它是现有set对象的副本。
#include <iostream>
#include <set>int main() {std::set<int> originalSet = {1, 2, 3}; // 原始set对象std::set<int> copySet(originalSet); // 使用复制构造函数创建新的set对象作为副本// 验证复制是否成功std::cout << "Original set: ";for (int num : originalSet) {std::cout << num << " ";}std::cout << std::endl;std::cout << "Copied set: ";for (int num : copySet) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
- 迭代器范围构造函数:通过一个已有的迭代器范围(如另一个容器的子范围)来构造set对象。
#include <iostream>
#include <set>
#include <vector>int main() {std::vector<int> vec = {10, 20, 30, 40, 50}; // 原始vector容器std::set<int> iteratorRangeSet(vec.begin(), vec.end()); // 使用迭代器范围构造函数创建set对象// 遍历并输出set中的元素for (int num : iteratorRangeSet) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
- 指定排序方式的构造函数:当构造自定义类型的容器时,可以指定一个自定义的比较函数来确定元素的排序方式。
#include <iostream>
#include <set>
#include <string>// 自定义比较函数,用于按字符串长度排序
struct CompareByLength {bool operator()(const std::string& lhs, const std::string& rhs) const {return lhs.length() < rhs.length();}
};int main() {std::set<std::string, CompareByLength> customSortSet = {"apple", "banana", "cherry", "date"}; // 使用自定义比较函数创建set对象// 遍历并输出set中的元素for (const std::string& str : customSortSet) {std::cout << str << " ";}std::cout << std::endl;return 0;
}
3.2 插入操作
set容器提供了多种插入元素的方法。
- insert方法:插入单个元素或插入一个范围内的元素。如果插入的元素已经存在于set中,则插入操作会被忽略。
#include <iostream>
#include <set>int main() {std::set<int> mySet;// 插入单个元素auto result1 = mySet.insert(5);if (result1.second) {std::cout << "Inserted 5 successfully." << std::endl;} else {std::cout << "5 already exists in the set." << std::endl;}// 尝试插入已存在的元素auto result2 = mySet.insert(5);if (result2.second) {std::cout << "Inserted 5 successfully." << std::endl;} else {std::cout << "5 already exists in the set." << std::endl;}// 插入一个范围内的元素(例如,从数组)int arr[] = {1, 2, 3, 4, 5};mySet.insert(arr, arr + 5);// 打印 set 中的元素std::cout << "Elements in the set: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
上述代码输出:
- emplace方法:直接在容器中构造元素,避免临时对象的创建和复制,性能更优。
#include <iostream>
#include <set>
#include <string>class Person {
public:std::string name;int age;Person(std::string name, int age){this->name = name;this->age = age;}// 需要定义 < 运算符,以便 set 可以对 Person 进行排序bool operator<(const Person& other) const {if (name != other.name) {return name < other.name;}return age < other.age;}
};int main() {std::set<Person> mySet;// 使用 emplace 插入单个元素mySet.emplace("Alice", 30);mySet.emplace("Bob", 25);// 尝试插入已存在的元素(根据我们的定义,name 和 age 都相同才算相同元素)auto result = mySet.emplace("Alice", 30);if (result.second) {std::cout << "Inserted Alice, 30 successfully." << std::endl;} else {std::cout << "Alice, 30 already exists in the set." << std::endl;}// 打印 set 中的元素std::cout << "Elements in the set: ";for (const auto& person : mySet) {std::cout << person.name << ", " << person.age << " ";}std::cout << std::endl;return 0;
}
上述代码输出:
3.3 删除操作
set容器提供了多种删除元素的方法。
- erase方法:删除指定元素、删除指定位置的元素或删除指定范围内的元素。
#include <iostream>
#include <set>int main() {// 创建一个set容器并添加一些元素std::set<int> mySet = {1, 2, 3, 4, 5};// 打印原始setstd::cout << "Original set: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// 删除指定元素(例如,删除元素3)mySet.erase(3);std::cout << "After erasing element 3: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// 插入元素以便演示删除指定位置的元素mySet.insert(3);mySet.insert(6);// 打印当前setstd::cout << "Current set before erasing position: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// 删除指定位置的元素(例如,删除第一个元素,即1)auto it = mySet.begin();mySet.erase(it);std::cout << "After erasing first element: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// 删除指定范围内的元素(例如,删除从3到5的元素)it = mySet.find(3); // 找到3的迭代器if (it != mySet.end()) {auto nextIt = std::next(it); // 指向下一个元素(4)的迭代器auto lastIt = mySet.find(5); // 找到5的迭代器,若不存在则返回end()if (lastIt != mySet.end()) {mySet.erase(nextIt, std::next(lastIt)); // 注意std::next(lastIt)是为了包含5但不越界} else {mySet.erase(nextIt, mySet.end()); // 若5不存在,删除从4到末尾的所有元素}}std::cout << "After erasing range [3, 5]: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
上述代码输出:
- clear方法:清空set容器中的所有元素。
#include <iostream>
#include <set>int main() {// 创建一个set容器并添加一些元素std::set<int> mySet = {1, 2, 3, 4, 5};// 打印原始setstd::cout << "Original set: ";for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// 清空set容器中的所有元素mySet.clear();std::cout << "After clearing the set: ";if (mySet.empty()) {std::cout << "The set is empty.";} else {for (const auto& elem : mySet) {std::cout << elem << " ";}}std::cout << std::endl;return 0;
}
上述代码输出:
3.4 查找操作
set容器提供了高效的查找操作。
- find方法:查找指定元素的迭代器。如果找到该元素,则返回指向该元素的迭代器;否则返回end()迭代器。
#include <iostream>
#include <set>int main() {// 创建一个set容器并插入一些元素std::set<int> mySet = {1, 2, 3, 4, 5};// 使用find方法查找元素int valueToFind = 3;auto it = mySet.find(valueToFind);if (it != mySet.end()) {std::cout << "Found " << valueToFind << " at position: " << *it << std::endl;} else {std::cout << valueToFind << " not found in the set." << std::endl;}
}
- count方法:返回容器中给定值的数量(对于set容器,一般返回1或0)。
#include <iostream>
#include <set>int main() {// 创建一个set容器并插入一些元素std::set<int> mySet = {1, 2, 3, 4, 5};// 使用count方法计算元素数量std::cout << "Count of " << valueToFind << ": " << mySet.count(valueToFind) << std::endl;return 0;
}
- lower_bound和upper_bound方法:分别返回指向大于或等于给定元素的第一个元素的迭代器和指向大于给定元素的第一个元素的迭代器。
#include <iostream>
#include <set>int main() {// 创建一个set容器并插入一些元素std::set<int> mySet = {1, 2, 3, 4, 5};// 使用lower_bound和upper_bound方法int lowerBoundValue = 3;int upperBoundValue = 4;auto lowerIt = mySet.lower_bound(lowerBoundValue);auto upperIt = mySet.upper_bound(upperBoundValue);// -1代表未找到std::cout << "Lower bound of " << lowerBoundValue << ": " << (lowerIt != mySet.end() ? *lowerIt : -1) << std::endl;std::cout << "Upper bound of " << upperBoundValue << ": " << (upperIt != mySet.end() ? *upperIt : -1) << std::endl;return 0;
}
上述代码输出:
- equal_range方法:返回一个pair,表示给定元素在set容器中的范围(前闭后开)。
#include <iostream>
#include <set>int main() {// 创建一个set容器并插入一些元素std::set<int> mySet = {1, 2, 3, 4, 5};int valueToFind = 3;// 使用equal_range方法auto range = mySet.equal_range(valueToFind);// -1代表未找到std::cout << "Equal range of " << valueToFind << ": [" << (range.first != mySet.end() ? *range.first : -1) << ", " << (range.second != mySet.end() ? *range.second : -1) << ")" << std::endl;return 0;
}
上述代码输出:
3.5 访问元素
set容器提供了通过迭代器和成员函数来访问元素的方法。由于set容器中的元素是唯一的且有序的,因此不能直接通过下标来访问元素。但可以通过迭代器来遍历set容器中的元素。在C++11 及更高版本中,也可以使用范围 for 循环来遍历 std::set 容器中的元素。
#include <iostream>
#include <set>int main() {// 创建一个 std::set 容器,并插入一些整数元素std::set<int> mySet = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};// 使用迭代器来遍历 std::set 容器中的元素for (std::set<int>::iterator it = mySet.begin(); it != mySet.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 也可以使用范围 for 循环来遍历 std::set 容器中的元素(C++11 及更高版本)for (int elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
3.6 容量操作
set容器提供了一些容量相关的操作来管理和查询容器的大小。
- empty方法:判断容器是否为空。
#include <iostream>
#include <set>int main() {// 创建一个空的 std::set 容器std::set<int> mySet;// 使用 empty 方法判断容器是否为空if (mySet.empty()) {std::cout << "The set is empty." << std::endl;} else {std::cout << "The set is not empty." << std::endl;}return 0;
}
- size方法:返回容器当前元素的数量。
#include <iostream>
#include <set>int main() {// 创建一个空的 std::set 容器std::set<int> mySet;// 向 set 容器中添加一些元素mySet.insert(1);mySet.insert(2);mySet.insert(3);// 使用 size 方法返回容器当前元素的数量std::cout << "The set has " << mySet.size() << " elements." << std::endl;return 0;
}
- max_size方法:返回set容器能够容纳元素的最大值(虽然set容器没有容量的概念,但这个方法可以返回一个理论上的最大值)。
#include <iostream>
#include <set>int main() {// 创建一个空的 std::set 容器std::set<int> mySet;// 使用 max_size 方法返回 set 容器能够容纳元素的最大值// 注意:这个值通常非常大,表示理论上可以容纳的元素数量,而不是实际容量限制std::cout << "The maximum number of elements the set can hold is " << mySet.max_size() << "." << std::endl;return 0;
}
上述代码输出:
3.7 交换操作
set容器提供了swap方法来交换两个set容器的内容。
#include <iostream>
#include <set>int main() {// 创建两个 std::set 容器,并插入一些元素std::set<int> set1 = {1, 2, 3, 4, 5};std::set<int> set2 = {6, 7, 8, 9, 10};// 打印交换前的容器内容std::cout << "Before swap:" << std::endl;std::cout << "set1: ";for (int elem : set1) {std::cout << elem << " ";}std::cout << std::endl;std::cout << "set2: ";for (int elem : set2) {std::cout << elem << " ";}std::cout << std::endl;// 使用 swap 方法交换两个容器的内容set1.swap(set2);// 打印交换后的容器内容std::cout << "After swap:" << std::endl;std::cout << "set1: ";for (int elem : set1) {std::cout << elem << " ";}std::cout << std::endl;std::cout << "set2: ";for (int elem : set2) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
上述代码输出:
四、特性
-
自动排序:set容器中的元素会自动根据其值进行排序。你不需要像使用数组或链表那样手动排序。
-
唯一性:set容器只存储唯一的元素,这样可以确保数据的一致性,不会出现重复的数据。
-
高效的查找操作:由于set实现为红黑树,其查找、插入和删除操作的平均时间复杂度为O(log n)。
-
标准容器:set是C++标准库的一部分,因此与其它标准库组件有良好的兼容性。
-
值的不可变性:一旦将一个元素插入到set中,你就不能更改该元素的值(尽管可以通过删除旧元素并插入新元素来间接实现更改)。
-
内存使用:由于set需要为每个元素分配内存并维护一棵红黑树,所以它的内存使用可能会比其它容器(如数组或向量)更高。
-
迭代器的稳定性:set的迭代器在删除元素后可能会失效。如果你在迭代过程中删除元素,可能会导致未定义的行为。为了安全地删除元素,你可以先保存要删除元素的迭代器,然后在迭代完成后再进行删除。
五、应用场景
-
去重:set容器自动去重的特性使其成为处理去重问题的理想选择。
-
集合运算:set支持并集、交集和差集等集合运算,适用于需要进行集合操作的场景。
-
有序存储:set中的元素自动按顺序排列,适合需要有序存储的场景。
-
查找:set的查找操作时间复杂度为O(log n),适用于需要快速查找的场景。
结语
在C++的标准模板库(STL)中,set容器作为一种关联存储结构,以其独特的性质和高效的性能,在数据管理和处理中扮演着重要角色。通过本文深入学习和掌握set容器的使用方法和技巧,程序员可以更好地应对各种复杂的编程挑战,提升编程能力和水平。希望本文的介绍能够对你理解和使用set容器有所帮助。
如需更多信息,建议查阅C++参考手册中的set:
https://cppreference.cn/w/cpp/container/set
相关文章:
【C++】关联存储结构容器-set(集合)详解
目录 一、基本概念 二、内部实现 三、常用操作 3.1 构造函数 3.2 插入操作 3.3 删除操作 3.4 查找操作 3.5 访问元素 3.6 容量操作 3.7 交换操作 四、特性 五、应用场景 结语 一、基本概念 set是C标准模板库(STL)中的一种关联容器…...
如何利用SPSS软件进行多组间显著性检验以abcd显示
1.SPSS软件中进行多组间的显著性检验 要在SPSS软件中进行多组间的显著性检验,并以abcd显示结果,你可以按照以下步骤操作: 数据准备: 确保你的数据已经正确输入SPSS,其中每行代表一个观测值,包含至少两列&a…...
C++ 之计时函数总结
C 之计时函数总结 总结Windows下C开发时的计时实现 1. clock() #include <time.h> //引入头文件void main() {clock_t start, end;start clock();fun(); //需计时的函数end clock(); float t_cfloat(end-start)/CLOCKS_PER_SEC;cout << "func cos…...
仿dota2渲染--shader常见贴图含义(直观展示)
Properties {[Header(Texture)]_MainTex ("RGB:颜色 A:透贴", 2D) "white"{}_NormTex ("RGB:法线贴图", 2D) "bump" {}_MaskTex ("R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂…...
NoSQL大数据存储技术测试(5)MongoDB的原理和使用
单项选择题 第1题 关于 MongoDB 集群部署下面说法不正确的是() 已经不使用主从复制的模式 在实际应用场景中, Mongodb 集群结合复制集和分片机制 MongoDB 支持自动分片, 不支持手动切分 (我的答案) 每…...
视图、转发与重定向、静态资源处理
目录 视图 默认视图 视图机制原理 自定义视图 请求转发与重定向 静态资源处理 视图 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性 可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高 默认是最低优先级,Integer.MAX_…...
ThinkPHP 5.1 的模板布局功能
ThinkPHP 5.1 的模板布局功能,包括全局配置、模板标签以及动态方法布局三种方式。以下是对这三种方式的要点概括和补充,以便于更好地理解和使用: 方式一:全局配置方式 适用于全站使用相同布局的情况,配置简单且统一。…...
入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】
🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网…...
Redis Cluster 分片机制
Redis 集群是 Redis 提供的一种分布式实现,用于水平扩展数据存储能力。通过 Redis 集群,可以将数据分片存储在多个 Redis 节点上,同时提供高可用性和故障转移功能。 分片(Sharding): Redis 集群将数据划分…...
LightRAG测试BUG
错误一: LightRAG无法回答错误: INFO:lightrag:kw_prompt result:{{"high_level_keywords": ["xxx", "xxx"],"low_level_keywords": ["xxx", "xxx", "xxx"] }} JSON parsing e…...
关于手柄摇杆的连线
由于时间实在是太久远了,我也忘记具体的连线了,只能提供当时的连线图片。...
运算符优先级和,|| 的介绍
运算符优先级 关系运算的优先级高于逻辑运算,所以需要加上小括号来改变 更详细的运算符优先级可以去MATLAB官网看 &运算的优先级高于|优先级: &&,|| 的介绍 我们知道,&运算时,若第一个为 0 0 0&…...
Excel的文件导入遇到大文件时
Excel的文件导入向导如何把已导入数据排除 入起始行,选择从哪一行开始导入。 比如,前两行已经导入了,第二次导入的时候排除前两行,从第三行开始,就将导入起始行设置为3即可,且不勾选含标题行。 但遇到大文…...
SQL Having用法
拿个业务场景说这个案例,比如我们有个表里面可能有批改过的数据,批改过得数据不会随着新批改的数据覆盖,而是逐条插入表中,如果想找出包含最早批改的数据和最新批改数据的话,那么我们就需要用到了havinng 用法,假设最开…...
【mysql优化 | 新增分区】
在同步其他系统的数据,大概每天有16w多,目前已经600多万条数据了,导致查询的时候特别慢。 因为是报表,而且是每天统计,所以我们可以按照日期进行分区。 ALTER TABLE table PARTITION BY RANGE (TO_DAYS(rsdate)) (PA…...
vue 组件之间的传值方式
一、父组件向子组件传值 父组件可以使用 props 将数据传递给子组件。 <!-- 父组件 --> <template><ChildComponent :message"parentMessage" /> </template><script> import ChildComponent from ./ChildComponent.vue;export defau…...
VScode执行任务
背景 在vscode 中 如果执行命令需要传递进来参数,那么直接通过命令行终端的方式不太方便。通过task 任务的方式来进行启动执行,降低反复输入参数等繁琐工作。 首先可以查看vscode 官方文档 task 启动 crtl shift p .vscode/task.json 示例 执行cp…...
以太网链路详情
文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…...
将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)
将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上,然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…...
若依集成Uflo2工作流引擎
文章目录 1. 创建子模块并添加依赖1.1 新建子模块 ruoyi-uflo1.2 引入 Uflo2 相关依赖 2. 配置相关 config2.1 配置 ServletConfig2.2 配置 UfloConfig2.3 配置 TestEnvironmentProvider 3. 引入Uflo配置文件4. 启动并访问 Uflo2 是由 BSTEK 自主研发的一款基于 Java 的轻量级工…...
CV(4)--边缘提取和相机模型
前言 仅记录学习过程,有问题欢迎讨论 边缘提取(涉及语义分割): 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分,暗到亮为正 求边缘的幅度:sobel,Canny算子 图像分高频分量和低…...
使用html 和javascript 实现微信界面功能2
1.功能说明: 对上一篇的基础上进行了稍稍改造 主要修改点: 搜索功能: 在搜索框后面增加了搜索按钮。 搜索按钮调用performSearch函数来执行搜索操作。 表单形式的功能: 上传文件: 修改为表单形式,允许用户通过文件输入控件选择文件并上传。 …...
音视频入门基础:MPEG2-TS专题(12)—— FFmpeg源码中,把各个transport packet组合成一个Section的实现
一、引言 从《音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现》可以知道:FFmpeg源码中使用handle_packet函数来处理一个transport packet(TS包),该函数的前半…...
数据结构Day一
1.思维导图 2.顺序表的创建 seq.h #ifndef __SEQ_H__ #define __SEQ_H__#define max 30 typedef int DataType; typedef struct {DataType data[max];int len; }seqList,*seqListPtr;seqListPtr seq_create();#endifseq.c #include <stdio.h> #include <stdlib.h&g…...
cpptoml介绍
cpptoml 是一个用于 C 的开源库,旨在提供对 TOML(Toms Obvious, Minimal Language)格式的支持。它允许开发者轻松地在 C 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库,适用于那些希望将 TOML…...
迭代器(转
package Scala4 //迭代器 object hd { def main(args: Array[String]): Unit { var li1 List(1, 2, 3, 4, 5, 6) //依次输出List的元素 //1.循环 //li1.foreach(println) //2.迭代器 //2.1创建一个迭代器(iterator) // val it1li1.iterator.take(3)/…...
鸿蒙元服务上架
鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…...
查询三网话费余额接口,移动话费余额接口、电信话费余额接口、联通话费余额的接口+html前端查询UI界面
PHP是直接请求的接口,HTML代码也是直接请求的接口。如果HTML想上线运行,还是需要做下安全的。 下边是PHP代码 <?php // 定义API接口地址和参数 $apiUrl "https://api.taolale.com/api/Inquiry_Phone_Charges/get"; //API文档地址&…...
C#开发-集合使用和技巧(十)Union用法-并集
在 C# 中,IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素,确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法: 基本语法 public static IEnumerable<TSource> Union<TSource>(this…...
PyTorch 切片运算 (Slice Operator)
PyTorch 切片运算 {Slice Operator} 1. [:, -1, :]2. [:, [-1], :]References 1. [:, -1, :] https://github.com/karpathy/llama2.c/blob/master/model.py import torchlogits torch.arange(1, 16) print("logits.shape:", logits.shape) print("logits:\n&…...
leaflet 双屏对比
本章主要讲的是leaflet的双屏对比,本文参考了插件:Leaflet.Sync,我这里对原有的文件进行了重写,去掉了一部分不需要的内容,增加了flyTo和panTo方法,新的方法,如果需要可以自行下载资源。 目录 …...
渗透测试学习笔记(二)kali相关
一.kali 基础工具 NetCat -网络工具中的瑞士军刀:允许用户通过 TCP 或 UDP 协议发送和接收数据。WireShark-开源抓包软件TCPdump-命令行抓包分析工具 二. 被动信息收集 2.1 被动信息收集指从公开渠道获取信息,主要是已经公开的信息。 要点࿱…...
Python中的正交配对测试库:allpairspy
Python中的正交配对测试库:allpairspy 简介Python 中的 All-Pairs Testing 库安装 allpairspy使用 allpairspy 库的代码示例运行结果总结 简介 All-Pairs Testing (正交配对测试) 是一种广泛应用于软件测试中的组合测试方法,其核心思想是通过生成所有可…...
循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)
文章目录 部署一个web服务Kubernetes Port ForwardKubernetes ServicesClusterIP ServiceNodePort ServiceLoadBalancer Service 部署一个web服务 准备 Kubernetes 集群后,创建一个名为 web 的新 namespace,然后在该 namespace 中部署一个简单的 web 应…...
SpringBoot【八】mybatis-plus条件构造器使用手册!
一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学,想必大家对它不是非常陌生了吧,这期呢,我主要是围绕以下几点展开,重点给大家介绍 里…...
《HTML 的变革之路:从过去到未来》
一、HTML 的发展历程 图片: HTML 从诞生至今,经历了多个版本的迭代。 (一)早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准,提供了表格、文字绕排和复杂数学元素显示等新特性,但因实现复杂且缺乏浏览器…...
给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题
前言 最近在用自己的卡盒小程序的时候,发现卡片越来越多,有时候要找到某一张来看看笔记要找半天,于是自己做了一个搜索功能,先看效果: 怎么样,是不是还挺不错的,那么这篇文章就讲讲这样一个搜索…...
高阶数据结构--B树B+树实现原理B树模拟实现--Java
目录 一、B-树概念 二、B-树插入分析 1.用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下: 2.插入过程总结 三、B树插入实现 四、B树 1.B树概念 2.B树的特性 五、B树应用 1.索引 2.Mysql索引 3.InnoDB 一、B-树概念 1970 年, R.Bayer 和…...
CTF: 在本地虚拟机内部署CTF题目docker
step 1 安装基本依赖 sudo apt-get update sudo apt-get install -y \ca-certificates \curl \gnupg \lsb-releasestep 2 安装docker sudo apt-get remove docker docker.io containerd runc sudo apt-get update sudo apt-get install \apt-transport-https \ca-certificate…...
深度学习详解
深度学习(Deep Learning,DL)是机器学习(Machine Learning,ML)中的一个子领域,利用多层次(深层)神经网络来自动从数据中提取特征和规律,模仿人脑的神经系统来进…...
qt QCommandLineParser详解
1、概述 QCommandLineParser是Qt框架中提供的一个类,专门用于解析命令行参数。它简化了命令行参数的处理过程,使得开发者能够轻松定义、解析和验证命令行选项和参数。QCommandLineParser适用于需要从命令行获取输入的控制台应用程序,以及需要…...
支撑40多个委办局150余个应用场景,AI数字笔迹在多个领域助力数字重庆建设
12月6日,以“聚焦创新应用,AI引领赋能”为主题的2024 AI数字笔迹创新应用发展论坛在重庆两江新区举办。本届论坛由重庆市大数据应用发展管理局和重庆两江新区管理委员会联合指导,重庆亲笔签数字科技有限公司主办。现场来自政府部门、高等院校…...
MySQL 表字段太多超长问题及解决方案
哈喽,各位小伙伴们,你们好呀,我是。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学…...
LLM大语言模型私有化部署-OpenEuler22.03SP3上容器化部署Ollama与OpenWebUI
背景 你是不是也有私有化部署大模型的需求?如今有了 Ollama , HuggingFace , ModelScope 等开源平台,我们可以非常方便地搭建一个属于自己的大模型,如果网速给力,真是分分钟~~。简单起见,这篇文…...
【数据结构】哈夫曼树
哈夫曼树 路径长度:从树中一个结点到另一个结点之间的分支构成这两个节点之间的路径,路径上的分支数目称为路径长度 树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL ∑ k 1 n w k l k \sum^{n}_{k1}w_kl_k …...
网络安全法-网络运行安全
第三章 网络运行安全 第一节 一般规定 第二十一条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏或者未经授权的访问,防止网络数据泄露或者被窃取、篡改&…...
188-下翻便携式6U CPCI工控机箱
一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…...
【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 )
上一篇: 【0361】Postgres内核 page_read 读取所请求数据长度(至少 short page header)( 6 ) 文章目录 1. 检查 page_read 返回值 readLen2. 根据 readBuf 计算 XLogPageHeader 大小2.1 验证 XLOG Page header2.2 更新 XLogReaderState 读取状态信息1. 检查 page_read 返回…...
调度系统:Luigi 的主要特性和功能
Luigi 是一个开源的 Python 工作流管理工具,用于构建批处理作业管道,特别适用于数据工程领域。它被设计用来编排任务和处理任务间的依赖关系,支持自动化复杂的 ETL 流程、数据分析、模型训练等任务。 Luigi 的主要特性和功能: 任…...
GO泛型
泛型是goSDK1.18版本之后才引入的新特性,即C中的模板。 为什么要有泛型? 我们现在要写一个两数相加的函数,相加的逻辑很简单,但是如果传入不同的类型,那么我们就需要再写一个函数,定义不同的参数类型&#…...