STL-set+multiset

什么是关联式容器

      关联式容器中各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用, 在数据检索的时候比序列式容器效率更高,方便查找。例如set、multiset、 map以及multimap都是关联式容器

set

  1. set是按照键值自动排序的的容器,set的元素不像map那样可以同时拥有key和value,set中value就是key,key就是value
  2. 在set中,键就是值,每个键值必须是惟一的(因此使用set可以进行去重),multiMap 中元素是可以重复的
  3. set中的元素不能在容器中修改(迭代器被底层定义为const_iterator),但是可以从容器中插入或删除他们(因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织),multiSet一样。
  4. 当客户端对它进行新增元素操作或删除操作时,操作之前的迭代器,在操作完成之后都依然有效(被删除的那个除外)
  5. 在内部,(multi)set中的元素总是按照其内部比较对象所指示的特定排序准则进行排序
  6. (multi)set容器通过key访问单个元素的速度通常比unordered_(multi)set容器慢,但他允许根据顺序对自己直接进行迭代
  7. (multi)set在底层是用二叉搜索树(红黑树)实现的。(multi)set中查找某各元素,时间复杂度为:log_2 n,与底层数据结构有关
  8. 与map/multimap不同,map/multimap中存储的是真正的键值对<key,value>,(multi)set中只放value,但是底层实际存放的是由<value,value>构成的键值对;
  9. (multi)set中插入元素时,只需要插入value即可,不需要构造键值对
  10. (multi)set中的元素默认按照小于来比较

构造函数

函数名称函数功能
set(const Compare &comp=Compare(), const Allocator& = Allocator())set默认构造函数
set(const set<Key,Compare,Allocator>&x)拷贝构造函数
set(InpuIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator()用first到last区间中的元素构造set

set赋值操作

函数名称函数功能
set& operator=(const set &st)重载等号操作符
void swap(set<Key,Compare,Allocator>&x))交换两个集合容器

set大小操作

函数名称函数功能
size_type size()const返回容器中有效元素的数目
bool empty()const检测set是否为空,空返回true,否则返回false

set修改操作

函数名称函数功能
pair<iterator,bool> insert(const value_type &x)在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<钙元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false>
template void insert(InputIterator first, InputIterator last)在set中插入first到last区间中的元素
void erase(iterator position)删除pos迭代器所指的元素,返回下一个元素的迭代器
void erase(iterator beg, iterator end)删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
size_type erase(const key_type &elem)删除容器中值为elem的元素,返回删除的元素个数
void swap(set<Key,Comapre,Allocator>&st)交换set中的元素
void clear()清除所有元素
iterator find(const key_type &x)const返回set中值为x的元素的位置
size_type count(const key_type &x)const返回set中值为x的元素的个数

set查找操作

函数名称函数功能
find(key)查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()
count(key);查找键key的元素个数
lower_bound(keyElem)返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem)返回第一个key>keyElem元素的迭代器
equal_range(keyElem)返回容器中lower_bound和upper_bound组成的pair

set排序

class myCompare
{
public:
    bool operator()(int va1, int va2)
    {
        return va1 > va2;
    }
};

// set排序
void test04()
{
    set<int,myCompare> s1;
    s1.insert(5);
    s1.insert(1);
    s1.insert(7);

    //printSet(s1);

    for(set<int, myCompare>::iterator it = s1.begin(); it != s1.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

自定义数据类型的排序

class Person
{
public:
    Person(string name, int age)
        :m_Name(name)
        ,m_Age(age)
    {

    }
    string m_Name;
    int m_Age;
};
class myComparePerson
{
public:
    bool operator()(const Person &p1, const Person &p2)
    {
        if(p1.m_Age > p2.m_Age)
        {
            return true;
        }
        return false;
    }
};
void test05()
{
    set<Person, myComparePerson> s1;
    Person p1("大娃", 100);
    Person p2("二娃", 90);
    Person p3("三娃", 80);
    Person p4("四娃", 70);
    Person p5("爷爷", 1000);
    s1.insert(p1);
    s1.insert(p2);
    s1.insert(p3);
    s1.insert(p4);
    s1.insert(p5);
    // 插入自定义数据类型,上来就指定好排序规则
    // 显示
    for(set<Person, myComparePerson>::iterator it = s1.begin(); it != s1.end(); it++)
    {
        cout << "姓名:" << (*it).m_Name << "年龄:" << it->m_Age << endl;
        //(*it).m_Name = "浩二";
    }
}

常用方法

void test06()
{
    int array[] = {1,3,5,7,9,2,4,6,8,0,1,3,5,7,9,2,4,6,8,0};
    set<int> s(array, array + sizeof(array) / sizeof(array[0]));
    cout << s.size() << endl;
    
    //正向打印set中的元素,可以看出具有去重的作用
    for(auto &e : s)
    {
        cout << e << " ";
    }
    cout << endl;
    // 使用迭代器逆向打印set中的元素
    for(auto it = s.rbegin(); it != s.rend(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    // set中值为3的元素出现了几次
    cout << s.count(3) << endl;
}

pair

      对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有属性first和second访问。
      如何创建对组?
      第一种方法创建一个对组

pair<string, int> pair1(string("name"), 20);
cout << pair1.first << endl; //访问pair第一个值
cout << pair1.second << endl;//访问pair第二个值

      第二种创建一个对组

pair<string, int> pair2 = make_pair("name", 30);
cout << pair2.first << endl;
cout << pair2.second << endl;

      访问成员属性

pair<string, int> pair3 = pair2;
cout << pair3.first << endl;
cout << pair3.second << endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值