• C++标准模板库(STL)-set介绍


    在C++中,set是一种容器,它包含了唯一元素的有序集合。set库提供了一系列的类模板,用于创建和操作集合。

    set基本操作

    1. insert():此操作用于将元素插入到set中。调用insert()函数,并传入需要插入的元素即可。例如:s.insert(6);
    2. find():此操作用于在set中查找元素。调用find()函数,并传入需要查找的元素即可。如果元素存在于set中,该函数会返回一个指向该元素的迭代器;否则,返回end()。例如:auto it = s.find(3);
    3. erase():此操作用于从set中删除元素。调用erase()函数,并传入需要删除的元素即可。例如:s.erase(3);
    4. clear():此操作用于清空整个set。调用clear()函数即可。例如:s.clear();
    5. size():此操作用于获取当前set中的元素个数。调用size()函数即可。例如:int num = s.size();
    6. max_size():此操作用于获取set的最大容量。调用max_size()函数即可。例如:int max_num = s.max_size();
    7. count():此操作用于判断某个元素在set中出现的次数。调用count()函数,并传入需要判断的元素即可。例如:int count = s.count(6);

    set特性

    1. 唯一性:set中的元素是唯一的,不允许重复。
    2. 有序性:set中的元素是有序的,按照元素的插入顺序进行排列。
    3. 可变性:set中的元素是可以改变的,可以添加、删除或修改元素。
    4. 无序性:set中的元素是无序的,不能通过下标或者位置来访问元素。
    5. 高效的查找操作:set提供了高效的查找操作,可以在O(1)的时间复杂度内完成查找操作。
    6. 动态大小:set的大小是动态的,可以动态地添加和删除元素。
    7. 支持集合运算:set支持并集、交集、差集等集合运算,方便进行集合操作。
    8. 不支持下标访问:set不支持下标访问操作,只能通过迭代器访问元素。
    9. 线程不安全:set不是线程安全的,如果在多线程环境下使用,需要进行同步处理。

    应用举例

    1. 定义和初始化
    #include 
    #include 
    
    int main() {
        std::set s1;  // 定义一个空的set
        std::cout << "s1: ";
        for (int i : s1) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    
        std::set s2 = {1, 2, 3, 4, 5};  // 定义并初始化一个set
        std::cout << "s2: ";
        for (int i : s2) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出:

    s1: 
    s2: 1 2 3 4 5 
    
    • 1
    • 2
    1. 插入元素
    #include 
    #include 
    
    int main() {
        std::set s = {1, 2, 3, 4, 5};
        s.insert(6);  // 向set中插入元素6,并保持有序性
        std::cout << "s: ";
        for (int i : s) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出:

    s: 1 2 3 4 5 6
    
    • 1
    1. 查找元素
    #include 
    #include 
    
    int main() {
        std::set s = {1, 2, 3, 4, 5};
        auto it = s.find(3);  // 在set中查找元素3,并返回指向该元素的迭代器,如果元素不存在,返回end()。
        if (it != s.end()) {
            std::cout << "Found: " << *it << std::endl;  // 如果元素存在,输出该元素的值。此处应为Found: 3。注意,迭代器不能直接使用,需要使用*操作符取得其指向的值。也可以使用it->first或it->second来获取键或值。但这不是标准做法。在map中可以使用这种方式。在set中,键和值是同一个,所以使用*操作符。
        } else {
            std::cout << "Not Found" << std::endl;  // 如果元素不存在,输出Not Found。此处应为Not Found。注意,set不区分键和值,所以不能使用类似map的it->first或it->second的方式获取键或值。只能使用*操作符。但这不是标准做法。在map中可以使用这种方式。在set中,键和值是同一个,所以使用*操作符。在map中,键和值是不同的,所以可以使用first和second来获取键和值。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    238. 除自身以外数组的乘积
    仿牛客社区comment表的设计
    若依框架代码生成详解
    Stream流
    一生一芯13——linux设置环境变量
    django小技巧
    多线程(复习)
    港联证券:资金融通构成强支撑 “一带一路”金融合作开新局
    Vue3项目关于轮播图的封装应该怎么封装才是最简单的呢
    Java - 多进程编程(对比线程、API 操作)
  • 原文地址:https://blog.csdn.net/scy518/article/details/134522826