C++ STL set

文章展示了C++编程中如何使用集合(set)这一数据结构,包括初始化、插入、删除元素,判断集合是否为空,获取元素数量以及使用lower_bound和upper_bound等函数进行查找操作。此外,还演示了集合的遍历和迭代器的使用。
#include<iostream>
#include<vector>
#include<set>//集合头文件
using namespace std;
int main(){
    
//初始化
    set<int > ch;//默认升序排序
    set<int,greater<int >> ch1;//初始化降序排序
    set<char > ch2;
    set<double> ch3;
    //set<node> ch4;//结构体
    set<vector<int> > ch5;
    set<int > ch6[10];//set数组
    
//常用函数
    int num=1;
    ch.insert(num);//加入sum到集合,自动排序和去重,时间复杂度为 O(logN)
    ch.erase(num);//在集合中删掉num,返回0或1,0表示集合中不存在num
    ch.clear();//清空集合
    ch.empty();//判空,空则返回1,否则返回0
    ch.size();//返回集合元素个数
    ch.find(num);//在集合中查找num
        //ch.find()的返回值是一个迭代器,如果找到了给定的值那么迭代器指向该元素;否则迭代器指向集合的末尾
        /*
          set<int> ss;
          // 向集合中插入一些元素
          ss.insert(1);
          ss.insert(3);
          ss.insert(5);
          ss.insert(7);
          
          // 查找集合中是否有5这个元素
          set<int>::iterator it = s.find(5);
          
          // 如果找到了,输出"Found 5"
          if (it != ss.end())
          cout << "Found " << *it << endl;
          // 如果没有找到,输出"Not found"
          else
          cout << "Not found" << endl;
         */
        
    ch.lower_bound(num);//返回一个迭代器,指向第一个键值不小于x的元素
    ch.upper_bound(num);//返回一个迭代器,指向第一个键值大于x的元素
    
    ch.begin();//返回指向集合第一个元素的迭代器
    ch.end();//返回集合最后一个元素下一个位置的迭代器
    
    ch.rbegin();//返回指向集合最后一个元素的迭代器
    ch.rend();//返回第一个元素的前一个迭代器
    

    set<int > s;
    s.insert(5);
    s.insert(0);
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(5);
    
    //cout<<s.lower_bound(2);//这样写是错误的,s.lower_bound返回值为一个迭代器,用*s.lower_bound访问元素
    cout<<*s.lower_bound(2);
    cout<<*s.upper_bound(2);
    
    cout<<s.size();
    s.clear();
    cout<<s.size();
    
//集合的遍历        
    s.insert(55);
    s.insert(66);
    s.insert(11);
    s.insert(22);
    s.insert(33);
    s.insert(55);
    
    set<int >::iterator it;//迭代器,可以通过*it访问集合元素
    for(it=s.begin();it!=s.end();it++)cout<<*it<<" ";//遍历
    cout<<endl;
    
//The end!    
    
    return 0;
}
### 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、付费专栏及课程。

余额充值