stl_set

  • set容器是一种关联式容器,它用来存储同一数据类型的数据,并且能从一个数据集合中取出数据。在set容器中,每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set容器的底层使用一颗红黑树来实现,它是一种非线性的数据结构,每个节点最多有两个子节点
  • // 改变set的规则,改为从大到小,降序
    struct MyFunc
    {
        bool operator()(int val1, int val2) const
        {
            return val1 > val2;
        }
    };
    
    template <typename T>
    void PrintSet3(set<T, MyFunc>& s)
    {
        for (const auto& ele : s)
        {
            cout << ele << " ";
        }
    }
    
    void test02()
    {
        set<int, MyFunc> s1;
        for (int i = 0; i < 5; i++)
        {
            s1.insert(i + 1);
        }
        s1.insert(2);
        s1.insert(7);
        s1.insert(3);
        PrintSet3(s1);
    }
    
  • 必须要是const

  • set容器要求比较函数对象必须是const的,是因为set容器是一个有序的关联容器,它会根据比较函数对象的结果来排序和存储元素。如果比较函数对象不是const的,那么它可能会在调用过程中修改自身的状态或者影响其他元素的值,这样就会破坏set容器的有序性和唯一性。为了保证set容器的正确性和稳定性,比较函数对象必须是const的,这样它就不能修改自身或者其他元素的值,只能进行比较操作。

  • 同样的,map容器也要求比较函数对象必须是const的,因为map容器也是一个有序的关联容器,它会根据比较函数对象的结果来排序和存储键值对。如果比较函数对象不是const的,那么它可能会在调用过程中修改自身的状态或者影响其他键值对的值,这样就会破坏map容器的有序性和唯一性。为了保证map容器的正确性和稳定性,比较函数对象必须是const的,这样它就不能修改自身或者其他键值对的值,只能进行比较操作。

  • set函数的有序性和唯一性

  • set容器的有序性是指set容器中的元素会根据元素的值或者指定的比较函数对象进行排序,从小到大或者从大到小。set容器的有序性可以方便地对元素进行查找、删除和遍历
  • set容器的唯一性是指set容器中的元素的值都不能重复,也就是说每个元素只能出现一次。set容器的唯一性可以避免元素的冗余和重复
  • 储存对象的set访问类内的私有属性

  • 方法1 友元类

  • class MyMakerComparator;
    class Maker
    {
    public:
    	/*friend bool operator() (Maker& m1, Maker& m2);*/
    	friend MyMakerComparator;
    	friend void PrintMaker(set<Maker, MyMakerComparator>& s);
    	Maker(string name, int age)
    	{
    		this->name = name;
    		this->age = age;
    	}
    private:
    	string name;
    	int age;
    };
    
    class MyMakerComparator
    {
    public:
    	bool operator() (const Maker& m1,const Maker& m2) const
    	{
    		return m1.age < m2.age;
    	}
    };
    
    void PrintMaker(set<Maker, MyMakerComparator>& s)
    {
    	for (auto ele : s)
    	{
    		cout << "姓名:" << ele.name << " 年龄:" << ele.age << endl;
    	}
    }
    void test05()
    {
    	Maker m("纳西妲", 300);
    	set<Maker, MyMakerComparator> s;
    	s.insert(m);
    	s.insert(Maker("刻晴", 20));
    	PrintMaker(s);
    }
    
  • 方法二 友元函数

  • class Maker
    {
    public:
    	friend void PrintMaker(set<Maker, bool (*)(const Maker&, const Maker&)>& s);
    	friend bool MyMakerComparator(const Maker& m1, const Maker& m2);
    	Maker(string name, int age)
    	{
    		this->name = name;
    		this->age = age;
    	}
    
    private:
    	string name;
    	int age;
    };
    
    bool MyMakerComparator(const Maker& m1, const Maker& m2)
    {
    	return m1.age < m2.age;
    }
    
    void PrintMaker(set<Maker, bool (*)(const Maker&, const Maker&)>& s)
    {
    	for (auto ele : s)
    	{
    		cout << "姓名:" << ele.name << " 年龄:" << ele.age << endl;
    	}
    }
    void test05()
    {
    	Maker m("纳西妲", 300);
    	// 在需要使用比较函数的地方创建函数对象实例
    	set<Maker, bool (*)(const Maker&, const Maker&)> mySet(MyMakerComparator);
    	mySet.insert(m);
    	mySet.insert(Maker("刻晴", 20));
    	PrintMaker(mySet);
    }
    
  • 第33行的解释

    • 这句代码是在创建一个名为 mySetset 容器对象,并使用自定义的比较函数 MyMakerComparator 来对其中的元素进行排序和比较。

      具体解释如下:

    • set<Maker, bool (*)(const Maker&, const Maker&)>:这是 set 容器的类型声明。set 是一个有序容器,其中的元素类型是 Maker,并使用一个函数指针作为比较函数类型来对元素进行排序。

    • mySet:这是你创建的 set 容器对象的名称。

    • (MyMakerComparator):这是通过函数指针方式提供的比较函数,即 MyMakerComparator。它被传递给 set 容器,以在容器中对元素进行排序和比较。

      总而言之,这句代码创建了一个 set 容器对象 mySet,其中的元素类型是 Maker,并使用 MyMakerComparator 作为比较函数来确定元素的排序顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值