参考链接
- https://www.bilibili.com/video/BV1et411b73Z?p=223
set/multiset容器
基本概念
set/multiset属于关联式容器,底层结构是用二叉树实现
set和multiset区别
- set不允许容器中有重复的元素
- multiset允许容器中有重复的元素
set构造与赋值
构造:
set<T> st;
//默认构造函数set(const set &st);
//拷贝构造函数
赋值:
set& operator=(const set &st);
//重载等号操作符
set大小和交换
size();
//返回容器中元素的数目empty();
//判断容器是否为空swap(st);
//交换两个集合容器
set插入和删除
insert(elem);
//在容器中插入元素clear();
//清除所有元素erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器erase(beg, end);
//删除区间[beg, end)的所有元素,返回下一个元素的迭代器erase(elem);
//删除容器中值为elem的元素
set查找和统计
find(key);
//查找key是否存在,若存在,则返回该键的元素的迭代器;若不存在,返回set.end()count(key);
//统计key元素个数
set和multiset区别
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
pair对组创建
pair<type, type> p (value1, value2);
pair<type, type> p = make_pair(value1, value2);
set容器排序
set默认排序规则为从小到大,可以利用仿函数,可以改变排序规则
set存放内置数据类型
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test()
{
//指定排序规则从大到小
set<int, MyCompare> s;
s.insert(10);
s.insert(40);
s.insert(20);
for (set<int, MyCompare>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
set存放自定义数据类型
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
class comparePerson
{
public:
bool operator()(const Person&p1, const Person&p2)
{
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void test()
{
//自定义数据类型,都会指定排序规则
set<Person, comparePerson> s;
Person p1("刘备", 24);
Person p2("关羽", 28);
Person p3("张飞", 25);
s.insert(p1);
s.insert(p2);
s.insert(p3);
for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
{
cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
}
}