目录
1、基本概念
C++ STL中的
std::set
相当于集合,是用红黑树实现的关联容器,集合中的每个元素只出现一次(参照数学中集合的互斥性),并且是排好序的(默认按键值升序排列),能够提供高效的数据管理和操作。
std::set
中的元素必须是可比较的,且每个元素必须是唯一的。
2、set初始化
#include<set>
int main(){
//默认初始化一个空的set
std::set<int> mySet;
//使用初始化列表初始化set
std::set<int> mySet = {1, 2, 3, 4, 5};
//从另一个set复制初始化
std::set<int> anotherSet(mySet);
}
3、基本操作
3.1添加元素
std::set<int> mySet;
// 插入元素
mySet.insert(5);
// 插入多个元素
std::set<int> moreNumbers = {6, 7, 8};
mySet.insert(moreNumbers.begin(), moreNumbers.end());
3.2访问元素
//迭代器访问元素
for(std::set<int>::iterator it = mySet.begin(); it != mtSet.end(); ++it){
std::cout << *it << ' ';
}
std::cout << endl;
补充:关于 iterator
在C++中,iterator
是一个提供了对容器元素进行遍历访问的抽象概念。迭代器类似于指针,但它们提供了一种更通用和更安全的方式来访问容器中的元素。
3.3查找元素
// 查找元素
auto it = mySet.find(7);
if (it != mySet.end()) {
std::cout << "Found: " << *it << std::endl;
}
3.4删除元素
// 删除特定的元素
mySet.erase(5);
// 删除迭代器指向的元素
auto it = mySet.find(6);
if (it != mySet.end()) {
mySet.erase(it);
}
// 删除一定范围内的元素
mySet.erase(mySet.begin(), mySet.find(8));
3.5判断是否为空、获取大小
if (!mySet.empty()) {
std::cout << "The set is not empty." << std::endl;
}
std::size_t size = mySet.size();
4、高级操作
4.1范围查询
std::set
支持范围查询,可以找到某个值上下边界的元素。
// 查找不小于给定值的最小元素
auto lowerBoundIt = mySet.lower_bound(3);
// 查找大于给定值的最大元素
auto upperBoundIt = mySet.upper_bound(3);
// 范围查询,获取一个区间的所有元素
std::set<int>::iterator first = mySet.lower_bound(3);
std::set<int>::iterator last = mySet.upper_bound(3);
for (auto it = first; it != last; ++it) {
std::cout << *it << " ";
}
4.2自定义比较函数
struct CustomCompare {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序排列
}
};
std::set<int, CustomCompare> myCustomSet;
5、常用内部函数总结
构造函数和初始化
std::set()
:默认构造一个空的 set。std::set(const std::set& other)
:复制构造函数,创建一个与other
相同的 set。std::set(std::initializer_list<value_type> init)
:使用初始化列表构造 set。插入和赋值
insert(const value_type& value)
:在 set 中插入一个元素。insert(InputIt first, InputIt last)
:从迭代器指定的范围内插入元素。emplace(Args&&... args)
:就地构造元素并插入。swap(std::set& other)
:与other
交换内容。访问元素
find(const key_type& key)
:查找具有指定键的元素,返回一个迭代器。count(const key_type& key)
:返回具有指定键的元素的数量(在 set 中总是 0 或 1)。删除元素
erase(const_iterator position)
:删除迭代器指向的元素。erase(const key_type& key)
:删除具有指定键的元素。erase(const_iterator first, const_iterator last)
:删除指定范围内的所有元素。clear()
:移除 set 中的所有元素。大小和容量
empty()
:检查 set 是否为空。size()
:返回 set 中元素的数量。上下文操作
lower_bound(const key_type& key)
:找到不小于给定键的最低元素的迭代器。upper_bound(const key_type& key)
:找到大于给定键的最高元素的迭代器。equal_range(const key_type& key)
:返回一个 pair,包含lower_bound
和upper_bound
。比较
operator==
:比较两个 set 是否相等。operator!=
:比较两个 set 是否不相等。operator<
:比较一个 set 是否小于另一个 set。operator<=
:比较一个 set 是否小于或等于另一个 set。operator>
:比较一个 set 是否大于另一个 set。operator>=
:比较两个 set 是否大于或等于。其他
key_comp()
:返回一个用于比较 set 中元素的函数。value_comp()
:返回一个用于比较 set 中元素值的函数。
6、写在最后
std::set
是一个强大的容器,适用于需要自动排序和唯一性的场景。通过掌握其基本操作和高级功能,可以有效地管理数据集合。在实际编程中,合理利用std::set
可以提高代码的效率和可读性。
才疏学浅,然孜孜不倦。
欢迎大家批评指正!
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。