经典网站设计,seo营销技巧,秦皇岛企业建网站,网络营销推广方案内容一、基本概念
set容器是一种具备自动排序功能的集合#xff0c;默认递增排序#xff1b;元素无法直接修改#xff0c;且不能重复#xff1b;另一个版本叫做multiset#xff0c;允许存在重复元素#xff0c;其他功能和性质一样。
set容器底层结构一般为自平衡二叉搜索树…一、基本概念
set容器是一种具备自动排序功能的集合默认递增排序元素无法直接修改且不能重复另一个版本叫做multiset允许存在重复元素其他功能和性质一样。
set容器底层结构一般为自平衡二叉搜索树能够保证在O(logn)时间复杂度内完成删除、搜索、插入等操作。
set容器提供常量双向迭代器不支持随机访问不允许修改现有元素
二、构造函数 1、setTs; 默认构造函数
2、setTs{initializer _list} 初始化列表构造
3、setTs(setT other); 复制构造函数
4、setTs(setT other); 移动构造函数
5、setTs(iterator first,iterator last); 迭代器范围构造
6、setT,Key_Compares 指定排序方式的构造函数当构造自定义类型的容器时必须指定排序方式。Key_Compare是一个指定排序方式的自定义类型一般为类或者结构体封装了定义排序方式的仿函数。例如指定递减排序
class MyCompare {
public:bool operator()(const inta, const intb)const {return a b;}
};setint,MyCompare s;
在例子中模板参数列表中显式指定排序类型时实例化对象参数可省略。
set容器和前面其他容器一样都重载了多种构造方式可根据实际情况有选择使用。
三、成员函数
一迭代器函数
1、setT::iterator begin(); 返回指向容器首元素的迭代器
2、setT::iterator end(); 返回指向容器尾元素后面一个未知的迭代器
set容器提供的迭代器是双向迭代器不支持随机访问。当然set也包括反向版本rbegin()、rend()常量迭代器cbegin()、cend()等。
set容器提供的迭代器本质上都是常量迭代器所以set容器不允许修改当前元素。
二大小相关函数
1、bool setT::empty(); 判断容器是否为空
2、size_t setT::size(); 返回容器当前元素个数
3、size_t setT::max_size(); 返回set容器能够容纳元素的最大值 set容器没有容量的概念
三插入函数
STL源码中存在两种返回值的insert()函数例
1、iterator insert(Tvalue);
2、Pair insert(Tvalue);
第二个版本的返回类型Pair为一个组合类型包含iterator,bool两个结果这种组合类型叫做对组bool类型判断是否插入成功iterator类型指向插入位置的迭代器如果插入不成功指向end()。STL中通过条件编译实现了set容器调用版本2multiset容器调用版本1从而实现了set容器元素唯一multiset容器元素可重复。
insert();函数重载了以下几种插入方式。
1、insert(iterator pos,Tvalue); 迭代器指定插入位置复制插入元素
2、insert(iterator pos,Tvalue); 迭代器指定插入位置移动插入元素
3、insert(iterator first,iterator last); 插入区间内的元素
4、insert(initializer _list); 插入初始化列表
5、emplace(Tvalue); 在容器内直接构造变量较insert更高效
四删除函数
1、size_t erase(const Tvalue); 删除指定值set返回1multiset返回删除个数
2、iterator erase(iterator pos); 删除指定位置的值返回指向该位置迭代器
3、iterator erase(iterator first,iterator last);删除指定区间返回last
4、void setT::clear(); 清除容器所有内容
五查找函数
1、iterator setT::find(value); 查找给定值返回迭代器
2、size_t setT::count(value); 返回容器中给定值的数量set容器一般返回1或0
3、iterator setT::lower_bound(value); 返回第一个小于给定值的元素出现位置的迭代器
4、iterator setT::upper_bound(value); 返回第一个大于给定值的元素出现位置的迭代器
5、pairfirst,last setT::eque_range(value); 返回容器中给定值中间的区间前闭后开
六交换函数
1、void setT::swap(setT other); 交换两个set容器的内容
四、使用注意事项
一优势
自动排序std::set 中的元素自动根据其值进行排序。你不需要像使用数组或链表那样手动排序。唯一性std::set 只存储唯一的元素这样可以确保数据的一致性不会出现重复的数据。高效的查找操作由于 std::set 实现为红黑树其查找、插入和删除操作的平均时间复杂度为 O(log n)。标准容器std::set 是 C 标准库的一部分因此与其它标准库组件有良好的兼容性。
二劣势
值的不可变性一旦将一个元素插入到 std::set 中你就不能更改该元素的值。如果你需要修改一个元素的值你需要先删除旧的元素然后插入新的元素。内存使用由于 std::set 需要为每个元素分配内存并维护一棵红黑树所以它的内存使用可能会比其它容器如数组或向量更高。
三使用时需要注意的事项
元素的唯一性由于 std::set 存储唯一的元素如果你尝试插入一个已经存在的元素std::set 将不会做任何事情即不会插入重复的元素。因此在插入元素之前你可能需要检查元素是否已经存在于 set 中。迭代器的稳定性std::set 的迭代器在删除元素后可能会失效。如果你在迭代过程中删除元素可能会导致未定义的行为。为了安全地删除元素你可以先保存要删除元素的迭代器然后在迭代完成后再进行删除。与其它容器的交互当与其它容器如 std::vector 或 std::list进行交互时需要注意 std::set 的特性。例如将一个元素从一个 set 移动到另一个 set 或从 set 移动到另一个容器时需要特别小心。自定义比较函数std::set 需要一个比较函数来确定元素的排序和唯一性。确保你提供的比较函数是正确的并且对于所有可能的输入都能产生一致的结果。
四迭代器迭代过程删除元素实例
#include iostream
#include set int main() { std::setint my_set {1, 2, 3, 4, 5}; for (auto it my_set.begin(); it ! my_set.end(); ) { if (*it 3) { it my_set.erase(it); // 保存迭代器并删除元素 } else { it; // 继续迭代 } } // 输出 set 中的元素 for (const auto elem : my_set) { std::cout elem ; } std::cout std::endl; return 0;
}