C++ STL 容器篇之集合set

set是我们经常使用的一个容器,他是一个集合。不仅如此,它还把一些常用的操作封装在了set类型内,它在头文件中。

声明

set是一个模板类,每次使用时需要定义类型,例如set a这样来声明一个set。set一个int类型的数据集合。

set的特性

set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。他和我们平常使用的集合是一样的。

操作

下面列举一些set常用的操作

函数名作用
insert在set中添加一个数据
begin得到set头的指针
end得到set最后一个位置+1的指针
max_size返回set最大的大小
size返回当前的size大小
erase删除指针所指向的元素
clear清空set
empty判断set是否为空
find返回查找到元素的迭代器

使用示例

下面我们通过对一段程序来展示如何使用set。在程序中我们深入的了解一下如何使用set。

#include<iostream>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
int main(){
    int i;
    set<int> demo;//声明一个set<int>的变量,名为demo
    if (demo.empty()) {
        cout<<"此时demo为空"<<endl;
    }
    else{
        cout<<"此时demo不为空"<<endl;
    }
    
    for(i = 0; i < 10; i++){//向demo中添加十位1000以内的随机数
        demo.insert(rand()%1000);//添加一个1000内的随机整数
        //rand函数在头文件<algorithm>中,是产生一位随机数,我们通过mod的方法来产生我们需要的范围
    }
    
    for(set<int>::iterator it = demo.begin(); it != demo.end(); it++){
        //输出demo中的所有值,set<int>::iterator迭代器
        //通过输出我们发现他是有序了,从小到大排列的,这是set的特性之一,他会自动排序
        cout<<*it<<" ";
    }
    cout<<endl;
    
    //我们再插入一个数500,看看他所在的位置
    demo.insert(500);
    for(set<int>::iterator it = demo.begin(); it != demo.end(); it++){
        //我们发现500并没有被添加到头部或是尾部,而是有序的排列在中间
        cout<<*it<<" ";
    }
    cout<<endl;
    
    //我们在添加一个500看看
    demo.insert(500);
    for(set<int>::iterator it = demo.begin(); it != demo.end(); it++){
        //我们发现输出序列并没有变,还是只有一个500,这是因为集合中不允许两个相同的元素值
        cout<<*it<<" ";
    }
    cout<<endl;
    
    //我们来通过erase()函数删除元素500
    demo.erase(500);
    for(set<int>::iterator it = demo.begin(); it != demo.end(); it++){
        //这时候输出序列已经没有500了,但依然有序
        cout<<*it<<" ";
    }
    cout<<endl;
    
    //下面我们通过size()函数来获取当前所拥有的元素数
    cout<<"当前有"<<demo.size()<<"个元素"<<endl;
    //大家看看输出的size()和元素个数是否相符
    
    //下面我们通过clear()函数来清空set
    demo.clear();
    if (demo.empty()) {
        cout<<"此时demo为空"<<endl;
    }
    else{
        cout<<"此时demo不为空"<<endl;
    }
    return 0;
}

输出结果为:

此时demo为空
73 249 272 544 658 709 807 878 923 930 
73 249 272 500 544 658 709 807 878 923 930 
73 249 272 500 544 658 709 807 878 923 930 
73 249 272 544 658 709 807 878 923 930 
当前有10个元素
此时demo为空
Program ended with exit code: 0

这段程序大家也可以自己编译在自己的机器上运行一下,来帮助理解set的一些操作。

实际使用示例

下面我们在通过一个小题目来展示下使用set的一些简便之处。

例如PAT 基础编程题 7-16题:
这里面提供了一个非常暴力的一个方法,就是通过全排列枚举所有的情况,然后加入set中,利用set中不允许两个相同的元素和会自动排序的特性,来进行存储,和输出。

7-16 求符合给定条件的整数集 (15 分)
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
作者: 徐镜春
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

#include<iostream>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
int main(){
    int input,nums[4];
    set<int> all_ans;
    cin>>input;
    for(int i = 0 ;i < 4;i++){
        nums[i]=(input + i);
    }
    do{
        int mid = nums[0]*100+nums[1]*10+nums[2];
        all_ans.insert(mid);
    }
    while(next_permutation(nums, nums+4));//全排列
    int i = 1;
    for (set<int>::iterator it = all_ans.begin() ; it != all_ans.end(); it++) {
        cout<<*it;
        if(i % 6 == 0)
            cout<<endl;
        else
            cout<<" ";
        i++;
        
    }
    
    return 0;
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐