【C++STL】一篇总结std::set

目录

1、基本概念

2、set初始化

3、基本操作

3.1添加元素

3.2访问元素

3.3查找元素

3.4删除元素

3.5判断是否为空、获取大小

4、高级操作

4.1范围查询

4.2自定义比较函数

5、常用内部函数总结

6、写在最后


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 版权协议,转载请附上原文出处链接和本声明。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值