C++ STL Set 容器详解及常用操作

需积分: 49 8 下载量 111 浏览量 更新于2024-07-30 收藏 317KB PDF 举报
"c++_set操作说明" C++中的`set`容器是一种关联容器,它存储唯一的关键字值,并且按照这些值自动排序。`set`容器的实现基于红黑树数据结构,这使得插入、删除和查找操作的时间复杂度通常为O(log n)。在STL中,`set`提供了多种操作方法,适用于需要快速查找和保持数据唯一性的场景。 ### set容器的使用 要使用`set`,首先需要包含头文件`#include <set>`,并使用`std`命名空间。`set`模板类定义如下: ```cpp template< class Key, class Compare = less<Key>, class Allocator = allocator<Key> > ``` - `Key`:表示存储在`set`中的元素类型,即关键字的类型。 - `Compare`:是一个比较函数对象,用于确定元素之间的顺序,默认是`less<Key>`,提供小于关系的比较。 - `Allocator`:代表内存管理器,用于分配和释放内存,默认是`allocator<Key>`。 ### set的主要操作 #### 常用成员函数 1. 构造函数:创建一个空的`set`,或者使用初始序列或已存在的容器进行初始化。 2. 插入操作: - `insert(const value_type& val)`:插入一个元素。 - `insert(InputIterator first, InputIterator last)`:插入一个范围内的元素。 3. 删除操作: - `erase(const key_type& val)`:删除具有特定值的元素。 - `erase(iterator pos)`:删除迭代器指向的元素。 - `erase(iterator first, iterator last)`:删除迭代器范围内的元素。 4. 查询操作: - `find(const key_type& val)`:返回指向具有指定值的元素的迭代器,如果没有找到则返回`end()`。 - `count(const key_type& val)`:返回具有指定值的元素数量,对于`set`来说,结果要么是0要么是1。 5. 容量操作: - `empty()`:检查容器是否为空。 - `size()`:返回容器中元素的数量。 6. 迭代器操作: - `begin()`:返回指向第一个元素的迭代器。 - `end()`:返回指向最后一个元素之后的迭代器。 - `rbegin()`:返回反向迭代器,指向最后一个元素。 - `rend()`:返回反向迭代器,指向第一个元素之前的位置。 7. 修改操作: - `clear()`:删除所有元素。 8. 比较操作: - `operator==`(const set& x):比较两个`set`是否相等。 - `operator!=`(const set& x):比较两个`set`是否不相等。 - `operator<(const set& x)`:比较`set`的排序规则。 ### 使用示例 ```cpp #include <iostream> #include <set> int main() { std::set<int> mySet; // 插入元素 mySet.insert(10); mySet.insert(20); mySet.insert(30); // 输出元素 for (const auto& val : mySet) { std::cout << val << " "; } std::cout << std::endl; // 查找元素 if (mySet.find(20) != mySet.end()) { std::cout << "Found element 20" << std::endl; } // 删除元素 mySet.erase(20); return 0; } ``` ### 注意事项 - `set`中的元素值是唯一的,重复插入相同的元素不会增加元素数量。 - 元素的排序是由`Compare`模板参数决定的,如果需要自定义排序规则,可以传递自定义比较函数。 - `set`中的元素不可变,一旦插入,其值就不能被修改。如果需要修改值,通常需要删除原有元素并插入新值。 C++的`set`容器是处理唯一关键字值的有效工具,特别适用于需要快速查找、保持唯一性以及按特定顺序存储数据的场合。通过熟练掌握其操作方法,开发者可以更高效地编写代码。