• 数据结构:集合


    首先直接贴出来例程:

     1 #include<iostream>
     2 #include<set>
     3 using namespace std;
     4 struct Info  //如果集合中的元素是自定义类型,一定要重载<运算符 
     5 {
     6     string name;
     7     double score;
     8     bool operator<(const Info &a) const
     9     {
    10         return a.score<score;
    11     }
    12 };
    13 set<int> s;
    14 int main()
    15 {
    16     s.insert(1);
    17     s.insert(2);
    18     s.insert(3);
    19     s.insert(1);  //重复元素是不计算在内的 
    20     cout<<s.size()<<endl;  //当前集合中元素个数
    21     cout<<s.max_size()<<endl;  //当前集合最多放多少元素
    22     cout<<*s.begin()<<endl;  //当前集合的第一个元素
    23     cout<<*s.end()<<endl;  //当前集合的最后一个原生物 
    24     cout<<s.count(2)<<endl;  //判断某一个元素是否在集合出现过 
    25     set<int>::iterator tmp=s.find(3);   //返回当前元素的迭代器位置,如果没找到返回s.end() 
    26     cout<<*tmp<<endl; 
    27     for(set<int>::iterator it = s.begin();it!=s.end();++it)    
    28     {
    29         cout<<*it<<endl;
    30     }
    31     return 0;
    32 }

    然后我们注意几个地方就好了

    第一个地方是对于结构体的处理,要记住<运算符重载函数,因为set中的元素是默认有序的

    第二个需要注意的地方是find返回的是迭代器,一定不能直接cout或者直接用

    然后补充几个特殊的成员函数:

         pair<set<int>::const_iterator,set<int>::const_iterator> pr;
         pr = s.equal_range(3);
         cout<<"第一个大于等于 3 的数是:"<<*pr.first<<endl;
         cout<<"第一个大于 3的数是:"<<*pr.second<<endl;

    返回的是pair,而且pair里放的也是迭代器

     //删除迭代器位置的元素
         s.erase(s.begin());
     //删除迭代器区间的元素
         first = s.begin();
         second = s.begin();
         second++;
         second++;
         s.erase(first,second);
     //给定值,删除元素(好像只有这个有用)
         s.erase(8);

    其实上一个函数equal_range函数完全是为了规避遍历的

    这里还有一个类似的函数

         cout<<*s.lower_bound(3)<<endl;
         cout<<*s.upper_bound(3)<<endl;
    //返回第一个大于等于key的迭代器指针
    //返回第一个大于key的迭代器指针

    其实就是把pair拆开了。

    集合的用法就介绍到这里,目前我们在枚举集合元素,进行的交并补等运算时,都是采用二进制形式来处理的,具体可参考本博客的另一篇博文

  • 相关阅读:
    Codeforces 1355 D. Game With Array
    Codeforces 1355 C. Count Triangles
    Codeforces Round #641 (Div. 2)
    Codeforces 1345 D
    hdu6787(骰子+往回推的传输带问通过方案,dp)
    hdu6745(渐减1过程的最多互质对数,dp)
    D Points Construction Problem(思维构造,等周定理)
    Codeforces Round #658 (Div. 2)D(01背包)
    Codeforces Round #655 (Div. 2)E(矩阵范围dp)
    hdu4622([u,v]内有多少个子串)
  • 原文地址:https://www.cnblogs.com/aininot260/p/9324336.html
Copyright © 2020-2023  润新知