• 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;
    }
  • 相关阅读:
    JavaScript 将十进制数转换成格式类似于 0x000100 或 #000100 的十六进制数
    Java 从资源文件(.properties)中读取数据
    更改MySQL 5.7的数据库的存储位置
    PADS Layout VX.2.3 将PCB中的元器件封装保存到库
    怀疑安装MySQL之后,导致OrCAD Capture、Allegro就打不开
    Allegro PCB 转 PADS Layout 之后的修修补补
    Java 使用UDP传输一个小文本文件
    IntelliJ IDEA Commons IO环境搭建
    RestFul风格API(Swagger)--从零开始Swagger
    Spring容器的简单实现(IOC原理)
  • 原文地址:https://www.cnblogs.com/w-x-me/p/6796092.html
Copyright © 2020-2023  润新知