成长随心记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 << ' ';
}
}