c++ set和multiset

构造和赋值

/*
 * 构造和赋值
 */

/*
 * 简介:
 * 所有元素都会在插入时自动被排序
 *
 * 本质:
 * set/multiset属于关联式容器,底层是用二叉树实现
 *
 * set和mutiset区别:
 * set不允许容器中有重复的元素
 * mutiset允许容器中有重复的元素
 *
 */

#include <iostream>
#include <set>

void printSet(std::set<int> &s)
{
    for(auto e:s)
    {
        std::cout<<e<<" ";
    }
    std::cout<<std::endl;
}

void test01()
{
    std::set<int> s1;

    //插入数据只有insert方式
    s1.insert(10);
    s1.insert(40);
    s1.insert(30);
    s1.insert(20);
    s1.insert(30);

    //遍历容器
    //set容器特点:所有元素插入时会自动排序
    //set容器不允许插入重复值
    printSet(s1);

    //拷贝构造
    std::set<int> s2(s1);
    printSet(s2);

    //赋值
    std::set<int> s3;
    s3 = s2;
    printSet(s3);
}

int main()
{
    test01();

    return 0;
}

大小和交换

/*
 * 大小和交换
 */

#include <iostream>
#include <set>

void printSet(std::set<int> &s)
{
    for(auto e:s)
    {
        std::cout<<e<<" ";
    }
    std::cout<<std::endl;
}

//大小
void test01()
{
    std::set<int> s1;

    //插入数据
    s1.insert(10);
    s1.insert(30);
    s1.insert(20);
    s1.insert(40);

    printSet(s1);

    //判断是否为空
    if(s1.empty())
    {
        std::cout<<"s1 is empty"<<std::endl;
    }
    else
    {
        std::cout<<"s1 is not empty"<<std::endl;
        std::cout<<s1.size()<<std::endl;
    }
}

//交换
void test02()
{
    std::set<int> s1;

    //插入数据
    s1.insert(10);
    s1.insert(30);
    s1.insert(20);
    s1.insert(40);

    std::set<int> s2;

    //插入数据
    s1.insert(100);
    s1.insert(300);
    s1.insert(200);
    s1.insert(400);

    std::cout<<"before swap:"<<std::endl;
    printSet(s1);
    std::cout<<std::endl;
    printSet(s2);

    s1.swap(s2);

    std::cout<<"after swap: "<<std::endl;
    printSet(s1);
    std::cout<<std::endl;
    printSet(s2);
}

int main()
{
//    test01();
    test02();

    return 0;
}

插入和删除

/*
 * 插入和删除
 */

#include <iostream>
#include <set>

void printSet(std::set<int> &s)
{
    for(auto e:s)
    {
        std::cout<<e<<" ";
    }
    std::cout<<std::endl;
}

void test01()
{
    std::set<int> s1;

    //插入数据
    s1.insert(30);
    s1.insert(10);
    s1.insert(20);
    s1.insert(40);

    printSet(s1);

    //删除
    s1.erase(s1.begin());
    printSet(s1);

    //删除重载版本
    s1.erase(30);
    printSet(s1);

    //清空
//    s1.erase(s1.begin(), s1.end());
    s1.clear();
    printSet(s1);

}

int main()
{
    test01();

    return 0;
}

查找和统计

/*
 * 查找和统计
 */

#include <iostream>
#include <set>

//查找
void test01()
{
    std::set<int> s1;

    //插入数据
    s1.insert(10);
    s1.insert(30);
    s1.insert(20);
    s1.insert(40);

    auto pos = s1.find(30);
    if(pos != s1.end())
    {
        std::cout<<"find the elment"<<std::endl;
    }
    else
    {
        std::cout<<"not found the element"<<std::endl;
    }
}

//统计
void test02()
{
    std::set<int> s1;

    //插入数据
    s1.insert(10);
    s1.insert(30);
    s1.insert(20);
    s1.insert(40);

    //统计30的个数
    int num = s1.count(30);
    //对于set而言,统计的结果要么是0,要么是1
    std::cout<<"num: "<<num<<std::endl;
}

int main()
{
//    test01();
    test02();

    return 0;
}

set和mutiset区别

/*
 * set和mutiset区别
 */

/*
 * 区别:
 * set不可以插入重复数据,而mutiset可以
 * set插入数据的同时会返回插入结果,表示插入是否成功
 * mutiset不会检测数据,因此可以插入重复数据
 */

#include <iostream>
#include <set>

void test01()
{
    std::set<int> s;

    std::pair<std::set<int>::iterator, bool> ret = s.insert(10);

    if(ret.second)
    {
        std::cout<<"successful in the first insert"<<std::endl;
    }
    else
    {
        std::cout<<"failed in the first insert"<<std::endl;
    }

    ret = s.insert(10);

    if(ret.second)
    {
        std::cout<<"successful in the second insert"<<std::endl;
    }
    else
    {
        std::cout<<"failed in the second insert"<<std::endl;
    }

    std::multiset<int> ms;
    //允许插入重复值
    ms.insert(10);
    ms.insert(10);

    for(auto ele:ms)
    {
        std::cout<<ele<<" ";
    }
    std::cout<<std::endl;
}

int main()
{
    test01();

    return 0;
}

set内置类型指定排序规则

/*
 * set内置类型指定排序规则
 */

/*
 * 学习目标:
 * set容器默认排序规则为从小到大,掌握如何改变排序规则
 *
 * 主要技术点:
 * 利用仿函数,可以改变排序规则
 *
 */

#include <iostream>
#include <set>

class myCompare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1 > v2;
    }
};

void test01()
{
    std::set<int> s1;
    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(50);
    s1.insert(30);

    for(auto elem:s1)
    {
        std::cout<<elem<<" ";
    }
    std::cout<<std::endl;

    //指定排序规则为从大到小
    std::set<int, myCompare> s2;
    s2.insert(10);
    s2.insert(40);
    s2.insert(20);
    s2.insert(50);
    s2.insert(30);

    for(auto elem:s2)
    {
        std::cout<<elem<<" ";
    }
    std::cout<<std::endl;
}

int main()
{
    test01();

    return 0;
}

自定义数据类型指定排序规则

/*
 * 自定义数据类型指定排序规则
 */

#include <iostream>
#include <set>

class Person
{
public:
    Person(std::string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    std::string m_name;
    int m_age;

};

class comparePerson
{
public:
    bool operator()(const Person& p1, const Person& p2)
    {
        return p1.m_age > p2.m_age;
    }
};

void test01()
{
    //自定义数据类型 都会指定排序规则
    std::set<Person, comparePerson> s;

    //创建对象
    Person p1("liubei", 24);
    Person p2("guanyu", 28);
    Person p3("zahngfei", 25);
    Person p4("zhaoyun", 21);

    s.insert(p1);
    s.insert(p2);
    s.insert(p3);
    s.insert(p4);

    for(auto elem:s)
    {
        std::cout<<"name: "<<elem.m_name<<" age: "<<elem.m_age<<std::endl;
    }
}

int main()
{
    test01();

    return 0;
}
发布了39 篇原创文章 · 获赞 8 · 访问量 7935

猜你喜欢

转载自blog.csdn.net/weixin_40512640/article/details/103652986