• C++ set / multiset容器


    目录

    1. set基本概念

    2. set构造和赋值

    3. set大小和交换

    4. set插入和删除

    5. set查找和统计

    6. set和multiset的区别

    7. pair对组创建

    8. set容器排序


    1. set基本概念

    简介:

            所有元素都会在插入时自动被排序

    本质:

            set/multiset属于关联式容器,底层结构是用二叉树实现。

    set和multiset区别:

            set不允许容器中有重复的元素

            multiset允许容器中有重复的元素

    2. set构造和赋值

    功能:创建set容器以及赋值

    构造:

     赋值:

    示例: 

    1. #include
    2. using namespace std;
    3. #include
    4. void printSet(set<int> &s)
    5. {
    6. for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. set<int> s1;
    15. //插入数据 只有insert方式
    16. s1.insert(20);
    17. s1.insert(10);
    18. s1.insert(40);
    19. s1.insert(30);
    20. s1.insert(30);
    21. printSet(s1);
    22. }
    23. int main() {
    24. test01();
    25. system("pause");
    26. return 0;
    27. }

    结果:(结果是排好序的,而且无重复元素)

     

    拷贝构造:

    1. set<int> s2(s1);
    2. printSet(s2);

    赋值:

    1. set<int> s3;
    2. s3 = s2;
    3. printSet(s3);

    3. set大小和交换

    功能:

            统计set容器大小以及交换set容器

    函数原型:

            

     元素数目:

    1. set<int> s1;
    2. s1.size();

    是否为空:

    1. if (s1.empty())
    2. {
    3. }
    4. else
    5. {
    6. }

    交换:

    s1.swap(s2);

    4. set插入和删除

    功能:set容器进行插入数据和删除数据

    函数原型:

     示例:erase删除索引为1的位置上的元素:

    1. set<int>::iterator it = s1.begin();
    2. it++;
    3. s1.erase(it);

    结果:

    5. set查找和统计

    功能:对set容器进行查找数据以及统计数据

    函数原型:

     示例:(find)

    1. #include
    2. using namespace std;
    3. #include
    4. void test01()
    5. {
    6. set<int> s1;
    7. s1.insert(30);
    8. s1.insert(40);
    9. s1.insert(10);
    10. s1.insert(20);
    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 main() {
    22. test01();
    23. system("pause");
    24. return 0;
    25. }

    结果:

     

    统计元素个数:(有为1,没有为0)

    1. int num = s1.count(20);
    2. cout << num << endl;

    6. set和multiset的区别

            1.set不能插入重复数据,而multiset可以

            2.set插入数据的同时会返回插入结果,表示插入是否成功

            3.multiset不会检测数据,因此可以插入重复数据

    示例1:(判断set是否插入成功)

    1. #include
    2. using namespace std;
    3. #include
    4. //检查是否插入成功
    5. void check(pairint>::iterator, bool> &ret)
    6. {
    7. if (ret.second)
    8. {
    9. cout << "插入成功" << endl;
    10. }
    11. else
    12. {
    13. cout << "插入失败" << endl;
    14. }
    15. }
    16. void test01()
    17. {
    18. set<int> s;
    19. pairint>::iterator, bool> ret = s.insert(10);
    20. check(ret);
    21. //再次插入相同的元素
    22. ret = s.insert(10);
    23. check(ret);
    24. }
    25. int main() {
    26. test01();
    27. system("pause");
    28. return 0;
    29. }

    结果:

    multiset允许插入重复数据:

    1. multiset<int> ms;
    2. //multiset允许重复插入相同数据
    3. ms.insert(10);
    4. ms.insert(10);

    7. pair对组创建

    功能:成对出现的数据,利用对组可以返回两个数据

    两种创建方式:

    示例:

    1. #include
    2. using namespace std;
    3. #include
    4. void test01()
    5. {
    6. //第一种创建方式
    7. pairint> p1("Tom", 20);
    8. cout << "姓名:" << p1.first << "年龄:" << p1.second << endl;
    9. //第二种创建方式
    10. pairint> p2 = make_pair("Jerry",30);
    11. cout << "姓名:" << p2.first << "年龄:" << p2.second << endl;
    12. }
    13. int main() {
    14. test01();
    15. system("pause");
    16. return 0;
    17. }

    结果: 

     

    8. set容器排序

    学习目标:

            set容器默认排序规则为从小到大,掌握如何改变排序规则

    主要技术点:

            利用仿函数,可以改变排序规则

    示例1:(set存放内置数据类型,让set的排序规则为从大到小) 

    1. #include
    2. using namespace std;
    3. #include
    4. class MyCompare
    5. {
    6. public:
    7. bool operator()(int v1, int v2)
    8. {
    9. return v1 > v2;
    10. }
    11. };
    12. void test01()
    13. {
    14. //指定排序规则为从大到小
    15. set<int, MyCompare> s1;
    16. s1.insert(10);
    17. s1.insert(40);
    18. s1.insert(20);
    19. s1.insert(50);
    20. s1.insert(30);
    21. //打印s1
    22. for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
    23. {
    24. cout << *it << " ";
    25. }
    26. cout << endl;
    27. }
    28. int main() {
    29. test01();
    30. system("pause");
    31. return 0;
    32. }

     

    示例2:(set存放自定义数据类型,让set按照年龄降序) 

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. //自定义数据类型
    6. class Person
    7. {
    8. public:
    9. Person(string name, int age)
    10. {
    11. this->m_Name = name;
    12. this->m_Age = age;
    13. }
    14. string m_Name;
    15. int m_Age;
    16. };
    17. class comparePerson
    18. {
    19. public:
    20. bool operator()(const Person &p1, const Person &p2)
    21. {
    22. //按照年龄降序
    23. return p1.m_Age > p2.m_Age;
    24. }
    25. };
    26. void test01()
    27. {
    28. set s;
    29. //创建Person对象
    30. Person p1("Tom", 18);
    31. Person p2("Nick", 20);
    32. Person p3("Jerry", 16);
    33. Person p4("Flynt", 21);
    34. s.insert(p1);
    35. s.insert(p2);
    36. s.insert(p3);
    37. s.insert(p4);
    38. for (set::iterator it = s.begin(); it != s.end(); it++)
    39. {
    40. cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
    41. }
    42. }
    43. int main() {
    44. test01();
    45. system("pause");
    46. return 0;
    47. }

    结果:

     

  • 相关阅读:
    docker挂载目录权限问题
    java计算机毕业设计健康饮食推荐系统MyBatis+系统+LW文档+源码+调试部署
    【Vue】二:Vue核心处理---事件处理
    可编程 USB 转串口适配器开发板 S2S 功能介绍
    代码随想录算法训练营第五十七天| LeetCode 392 判断子序列、LeetCode 115 不同的子序列
    位运算的一些经典题目
    C语言基础小操作
    基于AI算法的5G多接入协同方案及关键技术
    记录 Git 操作时遇到的问题及解决方案
    500左右的耳机哪款降噪最好?500左右降噪最好的耳机推荐
  • 原文地址:https://blog.csdn.net/ChaoChao66666/article/details/127117127