集合 set
在 C++ 中,std::set
是标准模板库(STL)中的一种关联容器,主要用于存储唯一的元素,并且自动对元素进行排序。std::set
是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度都是 O(log n)。
1. std::set
的主要特性
std::set
的主要特性唯一性:
std::set
中的元素是唯一的,不能有重复元素。自动排序:
std::set
会根据元素的值自动进行排序,默认使用<
运算符进行排序(升序)。底层实现:基于平衡二叉树(红黑树),查找、插入和删除的时间复杂度为 O(log n)。
键即值:
std::set
中没有键值对的概念,存储的是元素本身,元素既是键也是值。
2. std::set
的主要方法
std::set
的主要方法2.1 插入元素
insert(const value_type& val)
:插入一个元素val
。如果元素已经存在,插入不会成功。示例:
emplace(Args&&... args)
:直接在set
中构造元素,可以避免拷贝操作。示例:
2.2 查找元素
find(const Key& k)
:查找键为k
的元素,返回指向该元素的迭代器。如果没有找到,返回end()
。示例:
count(const Key& k)
:返回键k
在集合中的数量。由于std::set
中元素唯一,因此返回值只能是0
或1
。示例:
2.3 删除元素
erase(const Key& k)
:删除键为k
的元素,返回删除的元素数量(0 或 1)。示例:
erase(iterator pos)
:删除迭代器pos
指向的元素,返回下一个元素的迭代器。示例:
2.4 容量操作
size()
:返回集合中元素的数量。示例:
empty()
:检查集合是否为空。如果为空返回true
。示例:
clear()
:清空集合,删除所有元素。示例:
2.5 迭代器操作
begin()
和end()
:返回指向第一个元素和最后一个元素之后的位置的迭代器。示例:
rbegin()
和rend()
:返回指向最后一个元素和第一个元素之前的位置的反向迭代器,用于反向遍历。示例:
2.6 范围操作
lower_bound(const Key& k)
:返回指向第一个大于等于k
的元素的迭代器。示例:
upper_bound(const Key& k)
:返回指向第一个大于k
的元素的迭代器。示例:
equal_range(const Key& k)
:返回一对迭代器,表示键k
的所有匹配元素的范围。在std::set
中,键是唯一的,所以这两个迭代器要么指向同一元素,要么指向相同的位置。示例:
3. 示例代码
4. std::set
的常见使用场景
std::set
的常见使用场景唯一性要求的集合:当需要存储一组唯一的元素时,比如存储学生学号、电话号码等。
有序性要求的集合:当需要自动排序的集合时,比如存储数据并需要按自然顺序访问。
快速查找和删除的集合:在需要快速查找、插入或删除元素的场景中,
std::set
可以提供 O(log n) 的时间复杂度。
5. 总结
insert(const value_type& val)
插入一个元素,若元素已存在则不插入。
emplace(Args&&... args)
原位构造并插入元素,避免拷贝。
find(const Key& k)
查找键为 k
的元素,返回指向该元素的迭代器。
count(const Key& k)
返回键为 k
的元素数量(0 或 1)。
erase(const Key& k)
删除键为 k
的元素。
size()
返回集合中元素的数量。
empty()
检查集合是否为空。
clear()
清空集合,删除所有元素。
lower_bound(const Key& k)
返回第一个小于等于 k
的元素的迭代器。
upper_bound(const Key& k)
返回第一个大于 k
的元素的迭代器。
equal_range(const Key& k)
返回与 k
匹配的元素的范围(两个迭代器)。
Last updated