• 78.C++ STL set/multiset容器


    目录

    1.什么是set和multiset

    2.set和multiset的区别:

    3.树的简单知识:

    4.构造函数和赋值函数

    5.set大小和交换

    6.set插入和删除

    7.set查找和统计


    1.什么是set和multiset

       setmultiset 是 C++ 标准库中的关联容器,底层结构是用二叉树实现。它们用于存储一组元素,并提供高效的元素查找和排序功能。所有元素都会在插入时自动被排序。

    2.set和multiset的区别:

    multiset特性及用法和set完全相同,唯一的差别在于它允许值重复。

    3.树的简单知识:

    ⼆叉树就是任何节点最多只允许有两个字节点。分别是左子结点和右子节点

            二叉搜索树,是指二叉树中的节点按照⼀定的规则进行排序,使得对二叉树中元素访问更加高效。二叉搜索树的放置规则是:任何节点的元素值⼀定大于其左子树中的每一个节点的元素值,并且小于其右子树的值。因此从根节点⼀直向左走,一直到无路可走,即得到最小值,一直向右走,直至无路可走,可得到最大值。那么在二叉搜索树中找到最大元素和最小元素是非常简单的事情。下图为⼆叉搜索树: 

            上面我们介绍了二叉搜索树,那么当一个二叉搜索树的左子树和右子树不平衡的时候,那么搜索依据上图表示,搜索9所花费的时间要比搜索17所花费的时间要多,由于我们的输入或者经过我们插入或者删除操作,二叉树失去平衡,造成搜索效率降低。 

    4.构造函数和赋值函数

    1. set st;//set默认构造函数:
    2. mulitset mst; //multiset默认构造函数:
    3. set(const set &st);//拷⻉构造函数
    4. set& operator=(const set &st);//?载等号操作符
    5. swap(st);//交换两个集合容器
    1. void printSet(set<int>& s)
    2. {
    3. for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    4. {
    5. cout << *it << " ";
    6. }
    7. cout << endl;
    8. }
    9. //构造和赋值
    10. int main()
    11. {
    12. set<int> s1;
    13. s1.insert(10);
    14. s1.insert(30);
    15. s1.insert(20);
    16. s1.insert(40);
    17. printSet(s1);
    18. //拷贝构造
    19. set<int>s2(s1);
    20. printSet(s2);
    21. //赋值
    22. set<int>s3;
    23. s3 = s2;
    24. printSet(s3);
    25. return 0;
    26. }

    5.set大小和交换

    1. size(); //返回容器中元素的数目
    2. empty(); //判断容器是否为空
    3. swap(); //交换两个集合容器
    1. int main()
    2. {
    3. set<int> s1;
    4. s1.insert(10);
    5. s1.insert(30);
    6. s1.insert(20);
    7. s1.insert(40);
    8. if (s1.empty())
    9. {
    10. cout << "s1为空" << endl;
    11. }
    12. else
    13. {
    14. cout << "s1不为空" << endl;
    15. cout << "s1的大小为: " << s1.size() << endl;
    16. }
    17. }

    1. int main()
    2. {
    3. set<int> s1;
    4. s1.insert(10);
    5. s1.insert(30);
    6. s1.insert(20);
    7. s1.insert(40);
    8. set<int> s2;
    9. s2.insert(100);
    10. s2.insert(300);
    11. s2.insert(200);
    12. s2.insert(400);
    13. cout << "交换前" << endl;
    14. printSet(s1);
    15. printSet(s2);
    16. cout << endl;
    17. cout << "交换后" << endl;
    18. s1.swap(s2);
    19. printSet(s1);
    20. printSet(s2);
    21. }

    6.set插入和删除

    1. insert(elem); //在容器中插入元素
    2. clear(); //清除所有元素
    3. erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    4. erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    5. erase(elem); //删除容器中值为elem的元素。
    1. //插入和删除
    2. int main()
    3. {
    4. set<int> s1;
    5. //插入
    6. s1.insert(10);
    7. s1.insert(30);
    8. s1.insert(20);
    9. s1.insert(40);
    10. printSet(s1);
    11. //删除
    12. s1.erase(s1.begin());
    13. printSet(s1);
    14. s1.erase(30);
    15. printSet(s1);
    16. //清空
    17. //s1.erase(s1.begin(), s1.end());
    18. s1.clear();
    19. printSet(s1);
    20. }

    7.set查找和统计

    1. find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    2. count(key); //统计key的元素个数
    1. //查找和统计
    2. int main()
    3. {
    4. set<int> s1;
    5. //插入
    6. s1.insert(10);
    7. s1.insert(30);
    8. s1.insert(20);
    9. s1.insert(40);
    10. //查找
    11. set<int>::iterator pos = s1.find(30);
    12. if (pos != s1.end())
    13. {
    14. cout << "找到了元素 : " << *pos << endl;
    15. }
    16. else
    17. {
    18. cout << "未找到元素" << endl;
    19. }
    20. //统计
    21. int num = s1.count(30);
    22. cout << "num = " << num << endl;
    23. }

     

    写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

  • 相关阅读:
    Docker安装pgAdmin4
    一文详解 implementation api embed
    AMD发布4.06.10.651版芯片组驱动 修复安装器无响应问题
    CF1721D Maximum AND
    docker常用命令
    MySQL 子查询
    IDEA如何运行web程序
    Node.js(1)
    单行文字垂直居中
    SpringCLoud——Eureka注册中心
  • 原文地址:https://blog.csdn.net/weixin_63779802/article/details/133916366