关于c++中set集合的使用

本文详细介绍了C++标准模板库中的set容器特点及其常用成员函数。包括元素自动排序、去重、插入、删除等操作,并对迭代器的使用进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set的特点是:

         会对集合中的元素根据键值自动排序,而且不允许集合中有重复元素

set中的函数:

        声明: set <类型> 名称    例如: set<int>s1;

       begin()返回指向第一个元素的迭代器

       end()返回指向最后一个元素的迭代器

       关于迭代器:

             声明:set<类型>::iterator 名称

            访问迭代器指向元素时使用   *名称

             需要注意的是: 迭代器只能自增,不能+1或者-1或者其他操作

                                           迭代器的类型要与定义的set类型相同

       删除函数:erase();      只能根据元素的值删除元素,不能根据第几个元素进行删除

       插入元素:insert();

     clear()--清除所有元素

  count()--返回某个值元素的个数

  empty()--如果集合为空,返回true equal_range()--返回集合中与给定值相等的上下限的两个迭代器

  find()--返回一个指向被查找到元素的迭代器

  get_allocator()--返回集合的分配器

  lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

  key_comp()--返回一个用于元素间值比较的函数

  max_size()--返回集合能容纳的元素的最大限值

  rbegin()--返回指向集合中最后一个元素的反向迭代器

  rend()--返回指向集合中第一个元素的反向迭代器

  size()--集合中元素的数目

  swap()--交换两个集合变量

  upper_bound()--返回大于某个值元素的迭代器

  value_comp()--返回一个用于比较元素间的值的函数

### C++ 中 `set` 的默认排序机制 在 C++ 标准库中,`std::set` 是一种关联容器,它存储唯一键并自动对其进行排序。对于内置类型(如 int, double),`set` 使用 `<` 运算符来进行元素之间的比较,默认情况下实现的是升序排列[^1]。 ```cpp #include <iostream> #include <set> int main() { std::set<int> s; s.insert(5); s.insert(3); s.insert(7); for (const auto& elem : s) { std::cout << elem << ' '; } } // 输出: 3 5 7 ``` 当涉及到用户定义的数据类型时,则需要提供额外的信息以便于编译器知道如何对比这些对象。这可以通过多种方式完成: - **重载小于运算符 (`<`)** 对于简单的类或结构体来说,最直接的方法就是为其成员函数或者全局命名空间下的非成员函数形式重新加载小于操作符。一旦实现了这个功能,在创建基于该类型的 `set` 容器实例化时就会自动应用此逻辑[^2]。 ```cpp struct Point { int x, y; bool operator<(const Point &p) const { // 重载 '<' 操作符 return this->x < p.x || (!(p < *this) && this->y < p.y); } }; ``` 除了上述提到的方式外还有其他三种主要途径可以用来定制 `set` 排序行为: - **使用仿函数作为第三个模板参数** 可以为 `set` 提供一个自定义的比较谓词,通过指定第三模板参数的形式传入。这种方式允许更灵活地控制排序顺序而无需修改原有类定义。 - **利用 lambda 表达式** 如果只需要临时改变某个特定范围内的排序规则,那么可以直接传递给构造函数一个匿名函数(lambdas),从而简化代码量同时也提高了可读性和维护性。 - **继承标准库中的 comparator 类型** 创建一个新的比较器类派生自现有的比较器,并覆盖其虚函数 compare 来达到目的;不过这种方法相对较少见也较为复杂一些。 综上所述,掌握了一种具体的设置方法之后就可以很容易地将其应用于类似的场景下,比如 multiset 和 map/multimap 等关联容器同样支持这样的扩展特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值