怎么做网站适配,wordpress 百度云,岫岩县网站建设,厦门网站建设求职简历阅读导航 前言一、set简介二、std::set1. std::set简介2. std::set的使用- 基本使用- std::set的模板参数列表- std::set的构造函数- std::set的迭代器- std::set容量与元素访问函数 3. set的所有函数#xff08;表#xff09; 三、std::multiset1. std::multiset简介 四、st… 阅读导航 前言一、set简介二、std::set1. std::set简介2. std::set的使用- 基本使用- std::set的模板参数列表- std::set的构造函数- std::set的迭代器- std::set容量与元素访问函数 3. set的所有函数表 三、std::multiset1. std::multiset简介 四、std::set与std::multiset的比较⭕**相同点**⭕**不同点**如何选择set 和 multiset 温馨提示 前言
前面我们讲了C语言的基础知识也了解了一些初阶数据结构并且讲了有关C的命名空间的一些知识点以及关于C的缺省参数、函数重载引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ 也了解了C中的模版以及学习了几个STL的结构也相信大家都掌握的不错接下来博主将会带领大家继续学习有关C比较重要的知识点—— set multiset (STL) 。下面话不多说坐稳扶好咱们要开车了
一、set简介
在C中set是标准库中的一个容器它实现了有序、不重复的元素集合。set容器基于红黑树数据结构实现提供了一系列的成员函数和操作符用于对元素进行插入、删除、查找等操作。其中set又分为set和multiset接下来博主将会带着大家认识一下这两个函数。 官方文档 链接 二、std::set
1. std::set简介
⭕ 官方文档 链接 std::set是C标准库中提供的一个容器它实现了一种有序的、不重复的元素集合。每个元素在std::set容器中都唯一并且以特定的顺序进行排序。std::set是基于红黑树数据结构实现的因此它具有高效的插入、删除和查找操作。
以下是std::set容器的一些特点
有序存储std::set中的元素是按照特定的排序准则进行有序存储的默认以升序排列。可以通过提供自定义的比较函数或函数对象来改变排序方式。唯一性std::set容器中的元素是唯一的不允许存在重复的元素。当尝试插入已经存在的元素时插入操作不会生效。动态大小std::set容器可以根据需要动态地增加或减少其大小。可以通过插入和删除操作来修改容器中的元素数量。快速插入、删除和查找基于红黑树数据结构std::set容器提供了高效的插入、删除和查找操作。这些操作的平均时间复杂度为O(logN)其中N是容器中的元素数。迭代器支持std::set容器提供了迭代器可以用于遍历容器中的元素并对其进行读取或修改操作。不支持直接访问元素由于std::set是基于有序集合实现的它并不支持通过下标操作符[]直接访问元素。如果需要按索引访问元素可以使用其他容器类型如std::vector。内存开销相对较大由于红黑树的特性std::set容器在内存使用方面可能比其他容器类型更占用空间。
注意
std::set中的元素是有序存储的因此插入、删除操作的时间复杂度为O(logN)查找操作的时间复杂度也为O(logN)其中N为std::set中元素的个数。使用std::set需要包含 set 头文件并使用 std::set 关键字声明一个std::set对象。
2. std::set的使用
- 基本使用
#include set
#include iostreamint main() {std::setint mySet;// 插入元素mySet.insert(10);mySet.insert(5);mySet.insert(8);// 遍历元素for (const auto elem : mySet) {std::cout elem ;}// 输出5 8 10// 查找元素auto it mySet.find(8);if (it ! mySet.end()) {std::cout Element found: *it std::endl;} else {std::cout Element not found std::endl;}// 删除元素mySet.erase(8);return 0;
}上述示例演示了创建一个std::set对象插入元素并遍历打印查找特定元素并删除元素的基本操作。
- std::set的模板参数列表 模板参数列表用于指定容器存储的元素类型和相关的比较函数。std::set 的模板参数列表如下
templateclass Key,class Compare std::lessKey,class Allocator std::allocatorKeyclass set;Key指定 std::set 容器中存储的元素类型。它可以是任何可比较的类型例如基本数据类型整数、浮点数、结构体、类对象等。元素类型必须支持 或自定义的比较函数用于元素排序。 Compare可选用于比较元素的函数或函数对象用于确定元素的相对顺序。默认情况下使用 std::lessKey即使用 运算符进行比较。如果希望使用其他比较方式可以自定义一个比较函数或函数对象并将其作为 Compare 参数传递给 std::set。比较函数或函数对象应该满足严格弱排序的要求。 Allocator可选指定用于分配内存的分配器类型。默认情况下使用 std::allocatorKey它使用标准的内存分配操作符 new 和 delete。也可以使用自定义的分配器类型以便对内存分配进行更灵活的控制。
- std::set的构造函数
下面的表格中列出了 std::set 的各种构造函数及其描述
构造函数描述set()默认构造函数创建一个空的 std::set 容器。set(const set other)复制构造函数创建一个新的 std::set 容器并复制给定容器中的所有元素。set(set other) noexcept移动构造函数创建一个新的 std::set 容器并使用给定容器中的元素初始化它。set(InputIt first, InputIt last)使用迭代器构造一个 std::set 容器并将给定范围内的元素添加到其中。输入迭代器应指向可比较的类型。set(InputIt first, InputIt last, const Compare comp)使用自定义比较函数构造一个 std::set 容器并将给定范围内的元素添加到其中。输入迭代器应指向可比较的类型。set(std::initializer_list key init)使用初始化列表构造一个 std::set 容器。set(std::initializer_list Key init, const Compare comp)使用自定义比较函数和初始化列表构造一个 std::set 容器。
其中Key 表示元素类型Compare 表示比较函数类型InputIt 表示输入迭代器类型。
这些构造函数提供了多种不同的方式来初始化 std::set 容器并将元素添加到其中。可以使用默认构造函数创建一个空容器使用复制构造函数从另一个容器中复制元素或使用迭代器和初始化列表来初始化容器。您还可以通过在构造函数参数中指定比较函数来控制元素的排序方式。
- std::set的迭代器
下面的表格中列出了 std::set 的一些常用迭代器相关函数及其描述
函数描述iterator begin()返回一个指向容器中第一个元素的迭代器。const_iterator begin() const返回一个指向容器中第一个元素的只读迭代器。iterator end()返回一个指向容器中最后一个元素之后位置的迭代器。const_iterator end() const返回一个指向容器中最后一个元素之后位置的只读迭代器。reverse_iterator rbegin()返回一个指向容器中最后一个元素的反向迭代器。const_reverse_iterator rbegin() const返回一个指向容器中最后一个元素的只读反向迭代器。reverse_iterator rend()返回一个指向容器中第一个元素之前位置的反向迭代器。const_reverse_iterator rend() const返回一个指向容器中第一个元素之前位置的只读反向迭代器。const_iterator cbegin() const返回一个指向容器中第一个元素的只读迭代器。const_iterator cend() const返回一个指向容器中最后一个元素之后位置的只读迭代器。const_reverse_iterator crbegin() const返回一个指向容器中最后一个元素的只读反向迭代器。const_reverse_iterator crend() const返回一个指向容器中第一个元素之前位置的只读反向迭代器。
这些函数用于获取不同类型的迭代器以访问 std::set 容器中的元素。您可以使用普通的正向迭代器begin() 和 end()来遍历容器中的元素也可以使用反向迭代器rbegin() 和 rend()来从后往前遍历容器。还提供了只读的常量迭代器和只读的常量反向迭代器以及对应的 cbegin()、cend()、crbegin() 和 crend() 函数。
- std::set容量与元素访问函数
⭕容量函数 bool empty() const noexcept: 该函数用于检查容器是否为空。如果容器为空则返回 true否则返回 false。 size_t size() const noexcept: 该函数返回容器中元素的数量。返回一个无符号整数表示容器中存储的元素个数。 size_t max_size() const noexcept: 该函数返回容器能够存储的最大元素数量。返回一个无符号整数表示容器能够支持的最大元素数量。
⭕元素访问函数 std::set::iterator find(const Key key): 如果找到了匹配的元素则返回指向该元素的迭代器如果未找到匹配的元素则返回指向容器结尾的迭代器 end()。 std::set::const_iterator find(const Key key) const: 该函数在容器中查找给定的键值并返回指向该元素的只读迭代器。这是 find 函数的只读版本返回一个指向匹配元素的只读迭代器或 end()。 size_t count(const Key key) const: 该函数统计容器中具有给定键值的元素个数。返回一个无符号整数表示具有给定键值的元素个数。 std::pairstd::set::iterator, std::set::iterator equal_range(const Key key): 该函数返回一个 pair 对象其中包含容器中所有键值等于给定键值的元素范围的起始和结束迭代器。返回一个由两个迭代器组成的 pair 对象第一个迭代器指向键值范围的起始位置第二个迭代器指向键值范围的结束位置后面的位置。 std::pairstd::set::const_iterator, std::set::const_iterator equal_range(const Key key) const: 该函数是 equal_range 函数的只读版本返回一个 pair 对象其中包含容器中所有键值等于给定键值的只读元素范围的起始和结束迭代器。
3. set的所有函数表
函数用法功能bool empty() const noexceptset.empty()检查容器是否为空size_t size() const noexceptset.size()返回容器中元素的数量size_t max_size() const noexceptset.max_size()返回容器支持的最大元素数量std::pairiterator, bool insert(const value_type value)set.insert(value)向容器中插入一个元素iterator insert(iterator hint, const value_type value)set.insert(hint, value)在给定位置之前插入一个元素template class InputIt void insert(InputIt first, InputIt last)set.insert(first, last)将指定范围内的元素插入到容器中iterator erase(iterator pos)set.erase(pos)删除给定位置的元素size_type erase(const key_type key)set.erase(key)删除具有给定键值的元素iterator erase(iterator first, iterator last)set.erase(first, last)删除给定范围内的元素void swap(set other)set.swap(other)交换两个集合容器的内容void clear() noexceptset.clear()清空容器中的所有元素iterator find(const key_type key)set.find(key)在容器中查找具有给定键值的元素并返回指向该元素的迭代器如果未找到则返回 end() 迭代器const_iterator find(const key_type key) constset.find(key)在容器中查找具有给定键值的元素并返回指向该元素的只读迭代器如果未找到则返回 end() 迭代器size_type count(const key_type key) constset.count(key)返回具有给定键值的元素在容器中的个数iterator lower_bound(const key_type key)set.lower_bound(key)返回第一个不小于给定键值的元素的迭代器const_iterator lower_bound(const key_type key) constset.lower_bound(key)返回第一个不小于给定键值的元素的只读迭代器iterator upper_bound(const key_type key)set.upper_bound(key)返回第一个大于给定键值的元素的迭代器const_iterator upper_bound(const key_type key) constset.upper_bound(key)返回第一个大于给定键值的元素的只读迭代器std::pairiterator, iterator equal_range(const key_type key)set.equal_range(key)返回一个 pair 对象其中包含容器中所有键值等于给定键值的元素范围的起始和结束迭代器std::pairconst_iterator, const_iterator equal_range(const key_type key) constset.equal_range(key)返回一个 pair 对象其中包含容器中所有键值等于给定键值的只读元素范围的起始和结束迭代器key_compare key_comp() constset.key_comp()返回用于键值比较的函数对象value_compare value_comp() constset.value_comp()返回用于值比较的函数对象iterator begin() noexceptset.begin()返回指向容器中第一个元素的迭代器const_iterator begin() const noexceptset.begin()返回指向容器中第一个元素的只读迭代器iterator end() noexceptset.end()返回指向容器中最后一个元素之后位置的迭代器const_iterator end() const noexceptset.end()返回指向容器中最后一个元素之后位置的只读迭代器reverse_iterator rbegin() noexceptset.rbegin()返回一个指向容器最后一个元素的逆序迭代器const_reverse_iterator rbegin() const noexceptset.rbegin()返回一个指向容器最后一个元素的只读逆序迭代器reverse_iterator rend() noexceptset.rend()返回一个指向容器第一个元素之前位置的逆序迭代器const_reverse_iterator rend() const noexceptset.rend()返回一个指向容器第一个元素之前位置的只读逆序迭代器const_iterator cbegin() const noexceptset.cbegin()返回指向容器中第一个元素的只读迭代器同 begin()const_iterator cend() const noexceptset.cend()返回指向容器中最后一个元素之后位置的只读迭代器同 end()const_reverse_iterator crbegin() const noexceptset.crbegin()返回一个指向容器最后一个元素的只读逆序迭代器同 rbegin()const_reverse_iterator crend() const noexceptset.crend()返回一个指向容器第一个元素之前位置的只读逆序迭代器同 rend()
三、std::multiset
1. std::multiset简介
⭕ 官方文档 链接 std::multiset 是 C 标准库中的一个容器它实现了一个有序的、可重复的元素集合。和 std::set 不同的是std::multiset 允许存储多个相同的元素。
std::multiset 的特点包括
元素按照升序进行排序并且插入新元素后仍然保持有序。可以存储相同的元素即允许重复元素存在。插入和删除操作都具有对数复杂度。支持快速查找、遍历和迭代操作。
与其他容器类似std::multiset 提供了一系列成员函数来方便地操作集合数据例如插入元素、删除元素、查找元素等。此外std::multiset 还提供了迭代器来遍历集合中的元素并且可以使用自定义的比较函数来指定元素的排序方式。
以下是 std::multiset 常用的一些成员函数
insert: 插入一个元素或者一个范围的元素到 multiset 中。erase: 删除一个元素或者一个范围的元素。find: 在 multiset 中查找指定元素并返回一个指向该元素的迭代器。count: 计算某个元素在 multiset 中的个数。size: 返回元素个数。empty: 检查 multiset 是否为空。clear: 清空 multiset 中的所有元素。begin 和 end: 返回指向第一个元素和最后一个元素之后位置的迭代器用于遍历 multiset 中的元素。
注意std::multiset 并不支持修改元素的值因为它保持元素有序的特性。如果需要修改元素的值可以先从容器中删除该元素然后再插入修改后的值。
下面是一个简单的示例代码展示了如何使用 std::multiset
#include iostream
#include setint main() {std::multisetint numbers;// 插入元素numbers.insert(5);numbers.insert(2);numbers.insert(7);numbers.insert(5); // 允许插入重复元素// 遍历输出元素for (const auto num : numbers) {std::cout num ;}std::cout std::endl;// 查找元素auto it numbers.find(5);if (it ! numbers.end()) {std::cout 找到元素 *it std::endl;}// 删除元素numbers.erase(2);// 输出剩余的元素数量std::cout 剩余元素个数 numbers.size() std::endl;return 0;
}输出结果
2 5 5 7
找到元素 5
剩余元素个数3在使用上面与std::map的使用方法以及函数类型都一样这里我就不再过多的赘述了。详细的说明可以看官方文档的介绍
四、std::set与std::multiset的比较
⭕相同点
容器类型它们都是关联容器用于存储一组按照特定顺序排列的元素。元素的访问它们提供了类似于容器的访问方式可以使用迭代器进行遍历还可以直接访问指定位置的元素。迭代器支持它们都支持正向迭代器可以用于遍历元素。
⭕不同点 元素唯一性 std::set 中每个元素都是唯一的容器中不允许出现重复的元素。std::multiset 允许存储多个相同的元素可以在容器中存储重复的元素。 排序 std::set 中的元素是按照升序进行排序的默认使用 运算符进行比较。std::multiset 也对元素进行排序但与 std::set 不同的是它允许存储相同的元素因此可以有多个相同的元素按照顺序存储。 插入操作 向 std::set 插入重复的元素将被忽略只有第一个插入的元素会被保留。向 std::multiset 插入重复的元素会将所有的元素都保留。 查找操作 std::set 提供的查找函数返回的迭代器指向找到的元素或者尾后迭代器如果未找到。std::multiset 提供的查找函数返回的迭代器指向第一个匹配的元素。 删除操作 从 std::set 中删除一个元素将删除所有与之相等的元素。从 std::multiset 中删除一个元素只会删除一个匹配的元素。
如何选择set 和 multiset
如果需要保持元素的唯一性并进行快速查找可以选择 std::set。如果需要允许重复的元素并按照顺序进行存储和查找可以选择 std::multiset。
温馨提示
感谢您对博主文章的关注与支持另外我计划在未来的更新中持续探讨与本文相关的内容会为您带来更多关于C以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新不要错过任何精彩内容
再次感谢您的支持和关注。期待与您建立更紧密的互动共同探索C、算法和编程的奥秘。祝您生活愉快排便顺畅中秋快乐