zoukankan      html  css  js  c++  java
  • STL set容器常用API

    set容器,容器内部将数据自动排序(平衡二叉树),不能插入重复元素。multiset可以插入重复元素。不能修改容器中的值,通过删除值,在插入。

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<set>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    struct MyComapre{
        bool operator()(int v1, int v2){
            return v1 > v2;
        }
    };
    
    void printMySet(set<int, MyComapre> &s){
    
        for (set<int, MyComapre>::iterator it = s.begin(); it != s.end(); ++it){
            cout << *it << " ";
        }
        cout << endl;
    }
    
    //1. 
    /*
    set<T> st;//set默认构造函数:
    mulitset<T> mst; //multiset默认构造函数:
    set(const set &st);//拷贝构造函数
    
    insert(elem);//在容器中插入元素。
    clear();//清除所有元素
    erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    erase(elem);//删除容器中值为elem的元素。
    
    */
    
    
    void test01(){
        
        set<int, MyComapre> s;
        s.insert(4);
        pair<set<int, MyComapre>::iterator, bool> ret = s.insert(2);
        if (ret.second){
            cout << "第一次插入成功!" << endl;
        }
        else{
            cout << "第一次插入失败!" << endl;
        }
        s.insert(3);
        s.insert(9);
        s.insert(6);
    
        ret = s.insert(2);
        if (ret.second){
            cout << "第一次插入成功!" << endl;
        }
        else{
            cout << "第一次插入失败!" << endl;
        }
    
        //删除第一个元素的
        s.erase(2);
        s.erase(s.begin());
        //set容器迭代器什么类型?双向迭代器
    
        printMySet(s);
    }
    
    void print(const int &val){
        cout << val << " ";
    }
    
    void test02(){
        
        multiset<int> ms;
        ms.insert(7);
        ms.insert(4);
        ms.insert(9);
        ms.insert(2);
        ms.insert(10);
        ms.insert(2);
    
        for_each(ms.begin(), ms.end(), print);
        cout << endl;
    }
    
    //3. set查找操作
    /*
    find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    count(key);//查找键key的元素个数
    lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
    upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
    equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
    */
    
    void test03(){
        
        set<int> s;
        s.insert(1);
        s.insert(2);
        //s.insert(3);
        s.insert(4);
        s.insert(5);
    
        set<int>::iterator it = s.find(12);
        if (it == s.end()){
            cout << "查找失败!" << endl;
        }
        else{
            cout << "查找到的值是:" << *it << endl;
        }
    
        cout << "值为2的元素有:" << s.count(12) << "个!" << endl;
    
        //lower_bound  upper_bound
        it =  s.lower_bound(2);
        if (it == s.end()){
            cout << "查找失败!" << endl;
        }
        else{
            cout << "查找到的值是:" << *it << endl;
        }
    
        it = s.upper_bound(2);
        if (it == s.end()){
            cout << "查找失败!" << endl;
        }
        else{
            cout << "查找到的值是:" << *it << endl;
        }
        cout << "------------------------" << endl;
    
        pair<set<int>::iterator, set<int>::iterator> ret = s.equal_range(2);
        cout << *(ret.first) << endl;
        cout << *(ret.second) << endl;
    
    }
    
    //自定义数据类型
    class Person{
    public:
        Person(string name,int age){
            this->mName = name;
            this->mAge = age;
        }
    public:
        string mName;
        int mAge;
    };
    
    struct PersonRule{
        bool operator()(const Person &p1,const Person &p2){
            return p1.mAge > p2.mAge;
        }
    };
    
    void test04(){
    
        set<Person, PersonRule> s;
    
        s.insert(Person("aaa", 10));
        s.insert(Person("bbb", 70));
        s.insert(Person("ccc", 50));
        s.insert(Person("ddd", 30));
        s.insert(Person("eee", 40));
    
        for (set<Person, PersonRule>::iterator it = s.begin(); it != s.end();++it){
            cout << "Name:" << it->mName << " Age:" << it->mAge << endl;
        }
    
    
        cout << "----------------------" << endl;
    
        //!PersonRule()(p1, p2) && !PersonRule()(p2, p1)
    
        set<Person, PersonRule>::iterator it =  s.find(Person("aaa", 20));
        if (it == s.end()){
            cout << "查找失败!" << endl;
        }
        else{
            cout << "Name:" << it->mName << " Age:" << it->mAge << endl;
        }
    
    }
    
    int main(){
    
        //test01();
        //test02();
        //test03();
        test04();
    
    
        system("pause");
        return EXIT_SUCCESS;
    }
  • 相关阅读:
    表表达式,Substring, CharIndex, 多行数据变同一行的用法
    武汉三首,记录备忘,写的不好,以后再改
    竟然又有两年没有码字发帖了,真是快长草了,打磨一下,克服拖延症,重新回归,重新写起!
    屈指一算,竟然有一年半没有发帖了,真是时光荏苒,白云苍狗!
    下雨有感
    (ETW) Event Trace for Windows 提高 (含pdf下载)
    (ETW) Event Tracing for Windows 入门 (含pdf下载)
    Requirejs加载超时问题的一个解决方法:设置waitSeconds=0
    如何通过Socket TCP发送并接收一个文件?
    Microsoft.VisualBasic.DateAndTime.Timer 与 DateTime.Now.TimeOfDay.TotalSeconds 相当
  • 原文地址:https://www.cnblogs.com/w-x-me/p/6796092.html
Copyright © 2011-2022 走看看