C++ STL set/multiset 容器详解

1. 什么是set/multiset容器?

set/multiset属于关联式容器,底层结构使用二叉树实现的。
set/multiset的特点是︰所有的元素在插入时会自动被排序。而set与multiset容器的区别就是∶set容器中不允许有重复的元素,而multiset允许容器中有重复的元素。

2. set的初始化函数

set<T> st //默认构造函数
set(const set &st)   //拷贝构造函数
set& operator=(const set& st)   //重载登号操作符

3. set的插入和删除函数

insert(elem)   //在容器中插入元素

clear()        //清除所有元素

erase(pos)    
//删除pos迭代器所指的元素,返回下一个元素的迭代器

erase(beg,end)
//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
//当然,set的迭代器也不能进行代数运算

erase(elem)     //删除容器中值为elem的元素
 

4. set的大小和交换函数

size();    //返回容器中元素的数量

empty();     //判断容器是否为空

swap(st);     //交换两个集合容器  

5. 案例说明

#include
#include

using namespace std;

void Print(set<int> s)
{
    for(auto i=s.begin();i!=s.end();i++)
    {
        cout<<*i<<" ";
    }
    cout<<endl<<endl;
}
int main()
{
    set<int> s;
    s.insert(10);
    s.insert(20);
    s.insert(3);
    s.insert(5);
    s.insert(1);
    //插入后自动升序排序
    Print(s);
    cout<<s.size()<<endl;

    set<int>s2(s);
    Print(s2);

    set<int>s3=s2;
    Print(s3);
    s3.insert(0);
    s2.swap(s3);
    Print(s2);

    s.erase(s.begin());
    Print(s);
    s.erase(20);
    Print(s);

    s.clear();   //    s.erase(s.begin(),s.end());
    Print(s);
    if(s.empty())
    {
        cout<<"空"<<endl;
    }
    return 0;
}

6. set的查找与统计函数

find(key);   //查找key是否存在,存在返回该元素迭代器

cout(key);   //统计key元素个数 
//要注意的是,set不允许出现重复的元素,所以set的cout返回值只可能出现0/1

案例:

#include
#include
using namespace std;
//set容器的查找和统计

int main()
{
set<int>s;
s.insert(1);
s.insert(0);
s.insert(3);
s.insert(4);

auto pos=s.find(3);
cout<<*pos<<endl;
cout<<s.count(6)<<endl;
cout<<s.count(4)<<endl;
return 0;
}


7. set与multiset 的区别

Multiset是set集合容器的一种,其拥有set的全部内容,在此基础之上,multiset还具备了可以重复保存元素的功能,因此会有略微和set的差别。

Multiset容器在执行insert()时,只要数据不是非法数据和空数据,insert就总是能够执行,无论时一个数据还是一段数据。

Multiset容器中的find()函数回返回和参数匹配的第一个元素的迭代器,即时存在多个元素也只是返回第一个,如{10,20,20,20}搜索20进行匹配将会返回第二个参数,如果没有符合的参数则结束迭代器。

同理诸如lower_bound()等的需要进行一个位置的返回值,则统统返回第一个大于或等于查找的值。

#include
#include
using namespace std;
//set容器的查找和统计

int main()
{
multiset<int>s;
s.insert(1);
s.insert(0);
s.insert(3);
s.insert(4);
s.insert(4);

auto pos=s.find(3);
cout<<*pos<<endl;
cout<<s.count(2)<<endl;
cout<<*(s.lower_bound(2))<<endl;
cout<<s.count(4)<<endl;
return 0;
}

你可能感兴趣的:(c++,开发语言,青少年编程,笔记,学习方法)