zoukankan      html  css  js  c++  java
  • #include <set>

    1 multiset

    多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>

    2 set

    集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>

    1 count

    统计数量

    2 equal_range(const T&);找到红黑树的链表结点,遍历所有的元素

    3 find();查找元素

    4 insert(const T&);插入

    5 size();返回当前向量中已经存放的对象的个数

    1 multiset

    多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>

     1 #include <iostream>
     2 #include <set>
     3 
     4 int main()
     5 {
     6     std::multiset<int>myset;
     7 
     8     myset.insert(11);
     9     myset.insert(12);
    10     myset.insert(13);
    11     myset.insert(10);
    12     myset.insert(10);
    13     myset.insert(100);//和set不同,元素可以重复
    14 
    15     auto ib = myset.begin();
    16     auto ie = myset.end();
    17 
    18     for (; ib != ie; ib++)
    19     {
    20         std::cout << *ib << std::endl;
    21         printf("%p,%p
    ", ib._Ptr, ib);//智能指针
    22     }
    23 
    24     return 0;
    25 }

    multiset每一个结点都是一个链表,set每个结点是一个结点而已

     1 #include <iostream>
     2 #include <set>
     3 
     4 struct student
     5 {
     6     int id;
     7     char name[30];
     8 };
     9 
    10 struct stuless
    11 {
    12     bool operator()(const student &s1, const student &s2)//重载()
    13     {
    14         return s1.id < s2.id;
    15     }
    16 };
    17 
    18 int main()
    19 {
    20     student sarray[3] = { {10,"hello"},{ 3,"world" },{ 4,"hello world" } };
    21     std::multiset<student, stuless>myset(sarray, sarray + 3, stuless());//multiset每一个结点都是一个链表,set每个结点是一个结点而已
    22 
    23     student stu1 = { 20,"world hello" };
    24 
    25     myset.insert(stu1);//插入
    26 
    27     auto ib = myset.begin();
    28     auto ie = myset.end();
    29 
    30     for (; ib != ie; ib++)
    31     {
    32         std::cout << ib->id << " " << ib->name << std::endl;
    33     }
    34     
    35     return 0;
    36 }

    multiset的元素可以重复,因此equal_range(const T&);可以实现查找多个相同的元素

     1 #include <iostream>
     2 #include <set>
     3 
     4 void main()
     5 {
     6     std::multiset<int>myset;
     7 
     8     myset.insert(100);//插入
     9     myset.insert(101);
    10     myset.insert(100);
    11     myset.insert(103);
    12     myset.insert(100);
    13 
    14     auto pfind = myset.find(101);//find只查找一个元素
    15     std::cout << *pfind << std::endl << std::endl;
    16 
    17     auto allfind = myset.equal_range(100);//equal_range找到红黑树的链表结点,遍历所有的元素
    18 
    19     for (auto it = allfind.first; it != allfind.second; it++)//first是链表的头结点,second是最后一个空结点
    20     {
    21         std::cout << *it << std::endl;
    22     }
    23 }

    count

     1 #include <iostream>
     2 #include <set>
     3 
     4 void main()
     5 {
     6     std::multiset<int>myset;
     7 
     8     myset.insert(3);
     9     myset.insert(1);
    10     myset.insert(2);
    11     myset.insert(1);
    12     myset.insert(2);
    13     myset.insert(1);
    14     myset.insert(2);
    15     myset.insert(1);
    16 
    17     int i = 0;
    18     for (auto ib = myset.begin(), ie = myset.end(); ib != ie; ib++)
    19     {
    20         i++;
    21     }
    22 
    23     std::cout << i << std::endl;//打印结点数量
    24 
    25     std::cout << count(myset.begin(), myset.end(), 1);//打印结点元素是1的数量
    26 }

    multiset可以自动排序

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <set>
     4 
     5 template <class T>
     6 struct show
     7 {
     8 public:
     9     void operator()(T &t)
    10     {
    11         std::cout << t << " ";
    12     }
    13 };
    14 
    15 void main()
    16 {
    17     std::multiset<int>myset;
    18 
    19     myset.insert(3);
    20     myset.insert(1);
    21     myset.insert(2);
    22     myset.insert(1);
    23     myset.insert(2);
    24     myset.insert(1);
    25     myset.insert(2);
    26     myset.insert(1);
    27 
    28     for_each(myset.begin(), myset.end(), show<const int>());
    29 }

    2 set

    集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>

    find();查找元素

    size();返回当前向量中已经存放的对象的个数

     1 #include <iostream>
     2 #include <set>
     3 
     4 void main()
     5 {
     6     std::set<int>myset;//红黑树
     7 
     8     myset.insert(10);
     9     myset.insert(9);
    10     myset.insert(8);
    11     myset.insert(7);
    12     myset.insert(6);
    13     myset.insert(5);
    14     myset.insert(4);
    15     myset.insert(10);//如果插入的元素已经存在,将会放弃插入
    16 
    17     auto ib = myset.begin();
    18     auto ie = myset.end();
    19 
    20     for (; ib != ie; ib++)//即使插入的顺序是乱序,但是也会按从小到大的顺序输出
    21     {
    22         std::cout << *ib << std::endl;
    23     }
    24 }

    find查找元素

     1 #include <iostream>
     2 #include <set>
     3 
     4 void main()
     5 {
     6     std::set<int>myset;//红黑树
     7 
     8     myset.insert(10);
     9     myset.insert(9);
    10     myset.insert(8);
    11     myset.insert(7);
    12     myset.insert(6);
    13     myset.insert(5);
    14     myset.insert(4);
    15 
    16     auto findpos = myset.find(10);
    17 
    18     std::cout << *findpos << std::endl;
    19 }

    size();返回当前向量中已经存放的对象的个数

     1 #include <iostream>
     2 #include <set>
     3 
     4 void main()
     5 {
     6     std::set<int>myset;//红黑树
     7 
     8     myset.insert(10);
     9     myset.insert(9);
    10     myset.insert(8);
    11     myset.insert(7);
    12     myset.insert(6);
    13     myset.insert(5);
    14     myset.insert(4);
    15     myset.insert(10);//如果插入的元素已经存在,将会放弃插入
    16 
    17     std::cout << myset.size() << std::endl;//返回当前向量中已经存放的对象的个数
    18 }

    红黑树,处理纯数字非常少,处理类对象以及字符串

    pari起到获取插入返回值,第一个类型,类型比大小的方式

     1 #include <iostream>
     2 #include <set>
     3 #include <string>
     4 
     5 struct strless
     6 {
     7     bool operator()(const char *str1, const char *str2)//重载()
     8     {
     9         return strcmp(str1, str2) < 0;
    10     }
    11 };
    12 
    13 //红黑树,处理纯数字非常少,处理类对象以及字符串
    14 
    15 int main()
    16 {
    17     const char *cmd[] = { "abc", "calc", "notepad", "const", "xyz", "ghi" };
    18 
    19     std::set<const char *, strless>myset(cmd, cmd + 6, strless());//构造
    20     myset.insert("1234");//插入
    21     myset.insert("4567");
    22 
    23     std::pair<std::set<const char *>::iterator, bool>p = myset.insert("9876");//pari起到获取插入返回值,第一个类型,类型比大小的方式
    24 
    25     auto ib = myset.begin();
    26     auto ie = myset.end();
    27 
    28     for (; ib != ie; ib++)//迭代器访问
    29     {
    30         std::cout << *ib << std::endl;
    31     }
    32     std::cout << std::endl;
    33 
    34     auto rb = myset.rbegin();
    35     auto re = myset.rend();
    36 
    37     for (; rb != re; rb++)//反向迭代器访问
    38     {
    39         std::cout << *rb << std::endl;
    40     }
    41     std::cout << std::endl;
    42 
    43     std::set<const char *, strless>::iterator pfind = myset.find("calc");//查找
    44     std::cout << *pfind << std::endl;
    45 
    46     return 0;
    47 }
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/denggelin/p/5745280.html
Copyright © 2011-2022 走看看