set/multiset容器

set容器

set容器的特性,所有元素的都会根据元素的键值自动被排序,set的元素不像map那样可以同时拥有实值和键值,set元素及是键值也是实值,所以我们不能通过迭代器改变set元素值,会破坏set结构

multiset容器

他和set容器基本一样,唯一的区别就是multiset容器可以重复,他们的底层实现都是红黑树

常用函数接口

set构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数
set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
size();//返回容器中元素的数目
empty();//判断容器是否为空
set插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。
set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

其中解释一下这个find操作和这个equal_range操作

void test1 ()
{
    set<int>s;
    s.insert(10);
    s.insert(20);
    s.insert(40);
    set<int>::iterator it = s.begin();
    it = s.find(100); //失败返回的就是end的位置
    if (it == s.end())
    {
        cout << "未找到" << endl;
    }
    else
        cout << "find" << endl;
   
    cout << s.size() << endl;
    
    pri(s);
}

在双边寻找的时候,我们需要一个新的定义,就是pair“对组”,他的定义就是pair<iterator, iterator>,拥有两个迭代器类型,我们对他进行访问就好

 pair<set<int>::iterator, set<int>::iterator >ret=s.equal_range(40); 
    cout << *ret.first << "  " << *ret.second << endl;
multiset

他的和set的区别就是它允许出现相同的数据,

terator insert(value_type&& _Val) 这个是multiset的返回值,他的只是返回一个迭代器】pair<iterator, bool> insert(value_type&& _Val) 这个是set插入的返回值,而他多返回一个bool类型代表是否失败

set类型的逆序排列

我们要改变他的排列顺序就需要在容器定义的时候,使用set的仿函数,定义他的构造类型

class cmp
{
public:
     bool operator()(int v1,int v2)const
    {
        return v1 > v2;
    }
};
void text2()
{
    set<int, cmp>s;
    s.insert(10);
    s.insert(20);
    s.insert(50);
    s.insert(30);

    for (set<int, cmp>::iterator it = s.begin(); it != s.end(); it++)
        cout << *it << endl;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值