C++ STL set

1.set中常用的方法

begin()返回一个迭代器,它指向容器c的第一个元素
end()返回一个迭代器,它指向容器c的最后一个元素的下一个位置
rbegin()返回一个逆序迭代器,它指向容器c的最后一个元素
rend()返回一个逆序迭代器,它指向容器c的第一个元素前面的位置
clear()清空所有元素
empty()判断set是否为空
max_size()返回set中最大能装的元素个数
size()返回当前set的大小
erase()
erase(iterator)删除迭代器所在位置的元素
erase(first, second)删除两迭代器中间元素,左闭右开(]
erase(value)删除值为value的元素
find(value)返回值为value的迭代器
insert()
insert(value)插入值为value的元素
insert(first, second)插入迭代器first,second之间的元素
upper_bound(key)查找大于key的元素的迭代器
lower_bound(key)查找大于等于key的元素的迭代器
equal_range(key)放回两个lower_bound,和upper_bound组成的pair

注:1.begin end rbegin rend位置图示

2.自定义比较函数的2种方法

struct cmp{
    bool operator <(const your_type &a, const your_type &b){
        return a.data > b.data;//由大到小
    }
}
set<int, cmp> s;
struct Info{
    string name;
    float score;
    bool operator < (const Info &a) const {
    //按score从大到小排列
        return a.score<score;
    }
}
set<Info> s;
set<Info>::iterator it;

 

### C++ STL `set` 容器的用法、特性和示例 #### 特性概述 `set` 是 C++ 标准模板库(STL)中的关联容器之一,用于存储唯一键值的数据集合。该容器内部通常基于自平衡二叉树实现,这使得插入、删除和查找操作具有对数时间复杂度 O(log n)[^1]。 - **有序性**:`set` 中的元素按照严格弱序排列,默认情况下会升序保存数据。 - **唯一性**:不允许存在重复的关键字,即同一个数值只能出现一次。 - **自动排序**:每当有新元素加入时,它会被放置到合适的位置以保持整个序列处于已排序状态。 #### 基本语法与定义 要使用 `set` 需要包含 `<set>` 头文件: ```cpp #include <set> ``` 创建一个简单的整型 `set` 可以这样写: ```cpp std::set<int> mySet; ``` 如果想要改变默认比较方式可以传递第二个参数给模板实例化过程,比如降序排列: ```cpp struct DescendingOrder { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; std::set<int, DescendingOrder> descendingInts; ``` #### 插入元素 向 `set` 添加成员非常直观: ```cpp mySet.insert(42); mySet.emplace(7); // 更高效的原位构造方法 auto resultPair = mySet.insert_or_assign(mySet.end(), 8); // 如果已经存在则更新现有条目 ``` #### 查找元素 可以通过迭代器访问特定位置上的项目;也可以利用内置函数快速定位某个具体值得索引处对象: ```cpp if (mySet.find(42) != mySet.end()) { std::cout << "Found!" << '\n'; } // 或者更简洁的方式 bool contains(const T& value) : mySet.count(value) > 0; ``` #### 删除元素 移除指定项同样简单明了: ```cpp size_t erasedCount = mySet.erase(42); // 返回被删掉的数量 auto pos = mySet.find(7); if(pos!=mySet.end()){ mySet.erase(pos); // 使用找到的具体位置作为参数 } ``` #### 迭代遍历 最后但并非最不重要的是,通过循环结构逐一遍历所有记录也十分容易做到: ```cpp for(auto elem : mySet){ std::cout<<elem<<"\t"; } // 或者采用传统风格 for(std::set<int>::iterator itr=mySet.begin();itr!=mySet.end();++itr){ std::cout<<*itr<<"\t"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值