简介:
- 所有元素都会在插入时自动排序
本质:
- set/multiset属于关联式容器,地层结构是用二叉树实现
set和multiset区别:
- set不允许容器中有重复的元素
- multiset允许容器中有重复的元素
功能:
创建set容器以及赋值
构造:
- set st; //默认构造函数
- set(const set &st); //拷贝构造函数
赋值:
- set& operator=(const set &st); // 重载赋值运算符
实例:
#include
#include
using namespace std;
//set容器 构造和赋值
void PrintSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _01Test01()
{
set<int> st;
//插入数据 只有insert方式
st.insert(10);
st.insert(20);
st.insert(10);
st.insert(40);
st.insert(30);
st.insert(30);
//set容器特点:
//1、按顺序插入元素
//2、不能含有重复元素
PrintSet(st);
}
void main()
{
_01Test01();
}
set查找和统计
功能:
- 对set容器进行查找数据和统计数据
函数原型:
- find(elem); //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
- count(elem); //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;
示例:
#include
using namespace std;
#include
//set容器 查找和统计
//- find(elem); //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
//-count(elem); //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;
//查找
void _04Test01()
{
set<int> s;
s.insert(10);
s.insert(20);
s.insert(30);
s.insert(40);
set<int>::iterator it= s.find(40);
if (it == s.end())
{
cout << "未找到该元素" << endl;
}
else
{
cout << "找到了该元素" << endl;
}
}
//统计
void _04Test02()
{
set<int> s;
s.insert(10);
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(30);
s.insert(30);
s.insert(30);
int num=s.count(30);
//对于set而言,由于set容器不能包含重复元素 所以count只能返回1或0
cout << " num=" << num << endl;
}
void main()
{
//_04Test01();
_04Test02();
}
set和multiset区别
区别:
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
#include
using namespace std;
#include
// set和multiset的区别
void _05Test01()
{
set<int>s;
pair<set<int>::iterator, bool> ret;
//第一次插入10的时候可以成功插入
ret= s.insert(10);
if (ret.second)
{
cout << "插入成功" << endl;
}
else
{
cout << "插入失败" << endl;
}
//第二次插入1-的时候,插入失败
ret = s.insert(10);
if (ret.second)
{
cout << "插入成功" << endl;
}
else
{
cout << "插入失败" << endl;
}
}
void _05Test02()
{
multiset<int> ms;
ms.insert(10);
ms.insert(10);
ms.insert(10);
ms.insert(10);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void main()
{
//_05Test01();
_05Test02();
}
set容器排序
set容器默认排序规则是由小到大,掌握如何改变排序规则
只要技术点:
- 利用仿函数,可以改变排序规则
仿函数:
- 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类。
因此,这里需要明确两点:
1 仿函数不是函数,它是个类;
2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用函数)。
示例:
#include
using namespace std;
#include
//set容器 排序
class MySort
{
public:
//重载()
bool operator()(int num1, int num2)const
{
//按照降序排列
return num1 > num2;
}
};
void _07Test01()
{
//在插入数据前先指定排序规则(利用仿函数)
set<int,MySort> mySet;
mySet.insert(10);
mySet.insert(30);
mySet.insert(20);
mySet.insert(50);
mySet.insert(40);
for(set<int,MySort>::iterator it=mySet.begin();it!=mySet.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void main()
{
_07Test01();
}
set容器存放自定义数据类型-排序
技术要点:
- 利用仿函数改变排序规则
示例:
#include
#include
using namespace std;
//set容器 存放自定义数据类型 并自定义排序规则
class Person
{
public:
string m_Name;
int m_Age;
public:
Person(string name,int age)
{
this->m_Name = name;
this->m_Age = age;
}
};
class MyCompare
{
public:
bool operator()(const Person &p1,const Person &p2)const
{
if (p1.m_Age == p2.m_Age)
{
return p1.m_Name < p2.m_Name;
}
else
{
return p1.m_Age < p2.m_Age;
}
}
};
void _08Test01()
{
Person p1("刘备", 24);
Person p2("张飞", 35);
Person p3("关羽", 28);
Person p4("诸葛亮", 23);
Person p5("赵云", 28);
Person p6("吕布", 28);
Person p7("貂蝉", 28);
set<Person, MyCompare> s;
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
s.insert(p6);
s.insert(p7);
for (set<Person, MyCompare>::iterator it = s.begin(); it != s.end(); it++)
{
cout << "姓名:" << it->m_Name << "\t年龄:" << it->m_Age << endl;
}
}
void main()
{
_08Test01();
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)