set/multiset容器

一、set/multiset容器特性

会将所有元素根据元素的值进行排序,set是以RB-tree(红黑树-平衡二叉树的一种)为底层机制,其查找效率非常好,set容器不允许出现重复的元素,而multiset允许出现重复的元素。
注意:

  • 由于会自动排序,所以该容器不会提供push_back,push_front,pop_back,push_front这样的插入方法,只提供insert()的插入方法。
  • 不可以通过set的迭代器改变某一位置的值,因为这样就不一定满足RB-tree,如果非要把某一位置的数改了,就先删了该位置的元素,在添加要改成的元素。

常用API

1、构造函数

set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数

2、set的赋值操作

set& operator=(const set &st); //重载等号操作符
swap(st)//交换两集合容器

3、set大小操作

size();//返回容器中元素的数目
empty();//判断容器是否为空

4、set插入和删除操作

insert(elem); //在容器中插入元素
clear(); //清楚所有元素
erase(pos); //删除pos迭代器所指向的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end]的所有元素,返回下一个元素的迭代器
erase(elem);//删除容器中值为elem的元素

5、set查找操作

find(key); //查找可以是否存在,若存在,返回该建的元素的迭代器,若不存在,返回end()迭代器。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

例:

#include 
#include 
using namespace std;
int main()
{
    set<int> s1;
    s1.insert(3);
    s1.insert(7);
    s1.insert(8);
    s1.insert(1);
    s1.insert(2);
    set<int>::iterator it= s1.find(1);
    if(it==s1.end()) cout << "没有找到" << endl;
    else cout <<"找到了" << endl;
    it=s1.lower_bound(2); //返回大于等于指定值的位置
    cout << *it << endl;
    it=s1.lower_bound(4); //返回大于等于指定值的位置
    cout << *it << endl;
    /*
    同理upper_bound()是大于等于指定元素的迭代器
    */
    //equal_range返回lower_bound和upper_bound的值
    pair<set<int>:: iterator,set<int>:: iterator>myret=s1.equal_range(2);
    if(myret.first == s1.end())
    {
        cout << "没有找到" << endl;
    }
    if(myret.second == s1.end())
    {

        cout << " 没有找到" << endl;
    }
    if(myret.first != s1.end())
    {
        cout << "找到了" << *(myret.first)<<endl;
    }
    if(myret.second != s1.end())
    {

        cout << "找到了" <<*(myret.second) << endl;
    }
    return 0;

}

二、对组

队组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个共有函数first和second访问。
类模板:
intemplate struct pair

1、创建方法

//第一种
pair<string,int> pair1(string("name"),20);
cout << pair1.first << endl;//访问pair第一个元素
cout << pair.second << endl; //访问pair第二个元素
//第二种
pair <string,int> pair2=make_pair("nmae",30);
cout << pair2.first << endl;//访问pair2第一个元素
cout << pair2.second << endl; //访问pair2第二个元素

2、pair赋值

pair<string,int> pair3=pair2;
cout << pair3.first << endl;//访问pair3第一个元素
cout << pair3.second << endl; //访问pair3第二个元素

你可能感兴趣的:(c++,stl)