AndreaDO

导航

C++ STL容器 set类型

C++ STL容器 set类型

set是C++引入的二叉树数据结构
特点:

  • 自动将元素排序
  • 插入和删除查找logn
  • 必须元素支持严格的弱顺序
  • 不能改变元素的值

代码

 using Group = std::set<float>;
    
    
    // 初始化
    Group a={1.0f,4.0f,3.3,7.8,9.1,0.2};
    Group b=a;
    Group c(a);
    Group d(c.begin(),c.end());
    for(const auto& v:d)
    std::cout<<v<<'\n';
    
    std::cout<<"d.empty()="<<d.empty()<<'\n';
    std::cout<<"d.size()="<<d.size()<<'\n';
    std::cout<<"d.max_size()="<<d.max_size()<<'\n';
    // 支持 operator == != <> <= >=
    auto keycomp = d.key_comp(); //获取d集合的键比较对象,并将其存储在名为keycomp的变量中。
    auto valuecomp = d.value_comp();    //获取d集合的值比较对象,并将其存储在名为valuecomp的变量中。  
    // 赋值
    c = d;
    // 交换
    a.swap(d);
    std::swap(a,d);
    // 迭代器相关
    a.begin();
    a.end();
    a.cbegin();
    a.cend();
    a.rbegin();
    a.rend();
    a.crbegin();
    a.crend();
    auto iter1 = a.begin();

    auto find1 = d.find(1.0f);
    std::cout<<"d.count(1.0f)="<<d.count(1.0f)<<'\n';
    auto find2 = d.lower_bound(1.0f); //返回>=这个值的第一个迭代器位置
    // 注意,lower_bound 不保证返回的迭代器指向的元素在集合中确实存在
    auto find3 = d.upper_bound(1.0f); //返回>这个值的第一个迭代器位置
    auto find4 = d.equal_range(1.0f); //返回上面两个函数的位置

std::cout<<"b="<<'\n';
    for(const auto& v:b)
    std::cout<<v<<'\n';

    auto state = b.insert(100.0f);
     b.insert(c.begin(),c.end());
    b.emplace(11.1f);
    b.emplace_hint(b.end(),9.0f);

std::cout<<"2b="<<'\n';
     for(const auto& v:b)
    std::cout<<v<<'\n';

set的自定义比较

我们如果想要让自定义的类型放入set中自动排序,需要编写额外的函数。
注意set不允许修改元素,所以请把函数设置成const


struct compName{
template<class T>
bool operator()(const T& t1,const T& t2)const
{
    return t1.name1() <t2.name1();
}
};

struct compAge{
template<class T>
bool operator()(const T& t1,const T& t2)const
{
    return t1.age1() <t2.age1();
}
};

class Person{
private :
std::string name;
int age;
public:
Person(int age,std::string name):age(age),name(std::move(name))
{}
int age1()const {return age;};
const std::string& name1()const {return name;};
void show()const {
    std::cout<<"name "<<name<<" ,age "<<age<<'\n';
}
};

void mytest()
{
     Person p1(10,"A");
     Person p2(15,"O");
     Person p3(13,"B");
     Person p4(1,"P");
    using Group1 = std::set<Person,compAge> ;
    using Group2 = std::set<Person,compName> ;
    Group1 gp={p1,p2,p3,p4};
    Group2 gp2={p1,p2,p3,p4};
    std::cout<<"Age sort:"<<'\n';
    for( auto& v:gp)
        v.show();
    std::cout<<"Name sort:"<<'\n';
    for( auto& v:gp2)
        v.show();
}

输出结果

Age sort:
name P ,age 1
name A ,age 10
name B ,age 13
name O ,age 15
Name sort:
name A ,age 10
name B ,age 13
name O ,age 15
name P ,age 1

posted on 2024-02-28 13:32  AndreaDO  阅读(32)  评论(0)    收藏  举报