> 文档中心 > 成长随心记13(c++容器,set/multiset)

成长随心记13(c++容器,set/multiset)

7,set/multiset 容器
功能:所有元素在插入时都会排序
性质:底层类似数据结构的二叉树
区别:set不允许有重复的数据元素
         multiset允许有重复的数据元素

1)set构造函数和赋值:
函数原型:
setst//默认构造
set(const set &st)//拷贝构造
set& operator=(const set &st)//重载等号操作符

2)set大小和交换
size()//返回容器元素个数
empty()//判空
swap(st)//交换两个集合容器

3)list插入和删除
clear()//清空所有元素
erase(pos)//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end)//删除区间[beg,end)内所有元素,返回下一个元素的迭代器
erase(elem)//删除指定元素elem
insert(elem)//在容器内插入元素,有返回值pair,可以通过pair容器的bool值来查看是否插入成功
例:#include
int main()
{
    set s;
    pair<set::iterator,bool> ret=s.insert(10);
    if (ret.second) {
        cout << "插入成功" << endl;
    }
    else
        cout << "插入失败" << endl;

}

4)list查找和统计
find(key)//查找key是否存在,存在返回该元素的迭代器,不存在,返回set.end()
cout(key)//统计key的个数

5) set容器的排序规则
内置数据类型排序
例:
#include
class mycompare {
public :
    bool operator()(int v1, int v2) const {
        return v1 > v2;
    }
};
int main()
{
    int arr[] = { 1,3,2,4,7,5,9,6 };
    //从小到大(默认)
    sets1;
    s1.insert(arr, arr + 8);
    for (set::iterator it = s1.begin(); it != s1.end(); it++) {
        cout << *it ;
    }
    cout << endl;
    //从大到小,可以重写比较方式
    set s2;
    s2.insert(arr, arr + 8);
    for (set::iterator it = s2.begin(); it != s2.end(); it++) {
        cout << *it ;
    }
}

自定义数据类型排序
需要重写比较方式
例:
#include
class person {
public:
    person(int age) :mage(age) {}
    int mage;
};
class mycompare {
public:
    bool operator()(person p1, person p2)const {
        return p1.mage > p2.mage;
    }
};
int main()
{
    person p1(10), p2(34), p3(24), p4(54), p5(19);
    person arr[] = { p1,p2,p3,p4,p5 };
    set st(arr, arr + 5);
    for (set::iterator it = st.begin(); it != st.end(); it++) {
        cout <mage << ' ';
    }
}

 

全民K歌电脑版