鱼C论坛

 找回密码
 立即注册
查看: 1001|回复: 0

[技术交流] C++旅程第17站——Set

[复制链接]
发表于 2020-6-23 21:22:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Kites rise highest against the wind,not with it.
                                     Set
set:所有元素都会在插入时自动被排序

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

set和multiset区别:
set不允许容器中重复的元素——插入数据的同时会返回插入的结果,表示插入是否成功
multiset允许容器中有重复的元素——不会检测结果

  1. #include<iostream>
  2. #include<set>

  3. using namespace std;

  4. class Setcompare
  5. {
  6.         public:
  7.                 bool operator()(int v1,int v2)
  8.                 {
  9.                         return v1 > v2;
  10.                 }
  11. };

  12. void printset(set<int>&s)
  13. {
  14.         for(set<int>::iterator it = s.begin(); it != s.end(); it++)
  15.         {
  16.                 cout << *it << " ";
  17.         }
  18.         cout << endl;
  19. }

  20. void test1()
  21. {
  22.         set<int> s1;
  23.        
  24.         s1.insert(10);
  25.         s1.insert(49);
  26.         s1.insert(57);
  27.         s1.insert(20);
  28.        
  29.         //set元素插入时会自动排序,不允许插入重复值
  30.         printset(s1);
  31.        
  32.         //拷贝构造
  33.         set<int> s2(s1);
  34.         printset(s2);
  35.        
  36.         //赋值
  37.         set<int> s3;
  38.         s3 = s2;
  39.         printset(s3);
  40. }

  41. void test2()
  42. {
  43.         set<int> s1;
  44.        
  45.         s1.insert(10);
  46.         s1.insert(50);
  47.         s1.insert(30);
  48.         s1.insert(83);
  49.        
  50.         if ( s1.empty() )
  51.         {
  52.                 cout << "s1为空!!!!!!!" << endl;
  53.         }
  54.         else
  55.         {
  56.                 cout << "s1不为空!!!!!!!!!!" << endl;
  57.                 cout << "s1的大小为: " << s1.size() << endl;
  58.         }
  59.        
  60.         set<int> s2;
  61.        
  62.         s2.insert(56);
  63.         s2.insert(27);
  64.         s2.insert(47);
  65.         s2.insert(83);
  66.        
  67.         cout << "交换前!!!!!!!!!!" << endl;
  68.         printset(s1);
  69.         printset(s2);
  70.        
  71.         cout << "交换后!!!!!!!!!!!!" << endl;
  72.         s1.swap(s2);
  73.         printset(s1);
  74.         printset(s2);
  75.          
  76. }

  77. void test3()
  78. {
  79.         set<int>s1;
  80.        
  81.         s1.insert(22);
  82.         s1.insert(10);
  83.         s1.insert(48);
  84.         s1.insert(33);
  85.        
  86.         printset(s1);
  87.        
  88.         //删除
  89.         s1.erase(s1.begin());//在这里一定要注意一点,他这里删除的是最小的,因为是在排序的基础上在删除的
  90.         printset(s1);
  91.        
  92.         s1.erase(33);
  93.         printset(s1);
  94.        
  95.         //清空
  96.         s1.erase(s1.begin(),s1.end());
  97.         s1.clear();
  98.         printset(s1);
  99.          
  100. }

  101. void test4()
  102. {
  103.         set<int> s1;
  104.        
  105.         s1.insert(11);
  106.         s1.insert(52);
  107.         s1.insert(39);
  108.         s1.insert(65);
  109.        
  110.         set<int>::iterator a = s1.find(11);
  111.        
  112.         if ( a != s1.end())
  113.         {
  114.                 cout << "找到元素: " << *a << endl;
  115.         }
  116.         else
  117.         {
  118.                 cout << "未找到元素!!!!!! " << endl;
  119.         }
  120.        
  121.         int num = s1.count(52);
  122.         cout << "num =  " << num << endl;
  123.        
  124.         s1.insert(52);
  125.         s1.insert(52);
  126.        
  127.         num = s1.count(52);
  128.         cout << "num = " << num << endl;
  129.         //在set中,没有重复的数字,所以统计出来的结果不是0就是1
  130. }

  131. void test5()
  132. {
  133.         set<int> s1;
  134.        
  135.         s1.insert(80);
  136.         s1.insert(20);
  137.         s1.insert(76);
  138.         s1.insert(33);
  139.        
  140.         //默认升序
  141.         printset(s1);
  142.        
  143.         set<int,Setcompare>s2;
  144.        
  145.         s2.insert(65);
  146.         s2.insert(75);
  147.         s2.insert(28);
  148.         s2.insert(47);
  149.        
  150.         //降序
  151.         for(set<int>::iterator it = s2.begin(); it != s2.end(); it++)
  152.         {
  153.                 cout << *it << " ";
  154.         }
  155.         cout << endl;
  156. }

  157. int main()
  158. {
  159.         test1();//set构造和赋值
  160.        
  161.         test2();//set大小和交换
  162.        
  163.         test3();//set插入和删除
  164.        
  165.         test4();//set查找和统计
  166.        
  167.         test5();//set排序
  168.        
  169.         return 0;
  170. }
复制代码

                                             




本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 17:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表