文章目录
-
- 基本概念
- set和multiset区别
- set构造、赋值
- set 大小、交换
- set插入、删除
- set查找、统计
- set容器排序
- pair对组创建
基本概念
特点: 所有元素都会在插入时自动被排序
本质: set/multiset属于关联式容器,底层结构用二叉树实现
set和multiset区别
- set不允许容器中有重复的元素,multiset允许容器中有重复的元素
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
set构造、赋值
函数原型
构造:
set<T> st;
//默认构造set(const set &st);
//拷贝构造
赋值:
=
//重载等号操作符
set 大小、交换
函数原型
.size();
//返回容器中元素的数目.empty();
//判断容器是否为空.swap(st);
//交换两个set容器
set插入、删除
函数原型
插入:
.insert(elem);
//插入值为elem的元素
删除:
.clear();
//清除所有元素.erase(pos);
//删除指定pos位置的元素,返回下一个元素的迭代器.erase(beg,end);
//删除区间【beg,end)中的数据,返回下一个元素的迭代器.erase(elem);
//删除值为elem的元素
set查找、统计
函数原型
.find(key);
//查找key值是否存在,若存在,返回该值的元素的迭代器;若不存在,返回.end().count(key);
//统计key的元素个数,set容器结果只有0或1,multiset可以有不同的值
set容器排序
set容器默认排序规则为从小到大,可以利用仿函数来改变排序规则
示例一 set存放内置数据类型
//仿函数,指定排序规则为从大到小
class MyCompare
{
public:bool operator()(int v1, int v2) const{return v1 > v2;}
};set<int, MyCompare>s2; //传入自定义的仿函数,实现自定义排序
s2.insert(10);
s2.insert(30);
s2.insert(20);
s2.insert(50);
s2.insert(40);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {cout << *it << " ";
}
cout << endl;
输出结果:50 40 30 20 10
示例二 set存放自定义数据类型
//自定义的数据类型
class Person
{
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};//仿函数,指定排序规则为从大到小
class PersonCompare
{
public:bool operator()(const Person& p1, const Person& p2) const{//按照年龄降序return p1.m_Age > p2.m_Age;}
};//自定义数据类型,都会指定排序规则
set<Person,PersonCompare>s3;Person p1("Tom", 24);
Person p2("Jerry", 28);
Person p3("Peter", 25);
Person p4("Marry", 27);
s3.insert(p1);
s3.insert(p2);
s3.insert(p3);
s3.insert(p4);for (set<Person>::iterator it = s3.begin(); it != s3.end(); it++) {cout << "name:" << (*it).m_Name << " age:" << (*it).m_Age << endl;
}
输出结果:
name:Jerry age:28
name:Marry age:27
name:Peter age:25
name:Tom age:24
小结
- 利用仿函数可以指定set容器的排序规则
- 对于自定义数据类型,set必须要指定排序规则
pair对组创建
函数原型
pair<type,type> p (value1,value2);
pair<type,type> p = make_pair(value1,value2);
示例
//第一种创建方式pair<string, int>p("Tom", 20);cout << "name: " << p.first << " age: " << p.second << endl;//第二种创建方式pair<string,int>p2 = make_pair("Jerry", 15);cout << "name: " << p2.first << " age: " << p2.second << endl;