STL常用容器之 set multiset
文章目录
1. set multiset容器
1. set基本概念
- 所有元素插入时,自动排序
本质:set/multiset属于关联式容器,底层结构是二叉树实现。
set和multiset区别:
- set中不允许有重复的元素
- multiset允许容器中有重复的元素
2. set构造和赋值
函数原型:
构造:
set<T> st;//默认构造
set(const set& st);//拷贝构造
赋值:str& operator=(const set &st);//重载等号重载符
3. set大小和交换
函数原型:
size();
empty();
swap(st);
4. set插入和删除
函数原型:
insert(elem);//插入
clear();
erase(pos);//删除pos指向的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间内所有元素,返回下一个元素的迭代器
erase(elem);//删除容器中值为elem元素
5. set查找和统计
函数原型:
find(key);//查找key是否存在,返回迭代器,不在则返回set.end();
count(key);//统计key的个数
6. set和multiset区别
区别:
- set不可以重复数据,而multiset可以
- set插入数据的同时会返回插入的结果,表示是否插入成功
- multiset不会检测数据,因此可以插入重复数据
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void test()
{
set<int>s;
pair<set<int>::iterator,bool> ret = s.insert(10);
if(ret.second)
{
cout << "第一次成功" << endl;
}
else
{
cout << "第一次失败" << endl;
}
ret = s.insert(10);
if(ret.second)
{
cout << "第二次成功" << endl;
}
else
{
cout << "第二次失败" << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}
7. pair对组创建
- 成对出现的数据,利用对组可以返回两个数据
两种创建方式:
pair<type,type>p(value1,value2);
pair<type,type> p = make_pair(value1,value2);
例:
#include <iostream>
using namespace std;
void test()
{
//第一种方式创建
pair<string,int> p("Tom",18);
cout << "姓名: " << p.first << " 年龄: " << p.second << endl;
//第二种方式创建
pair<string,int>p1 = make_pair("Tom",188);
cout << "姓名: " << p.first << " 年龄: " << p.second << endl;
}
int main()
{
test();
system("pause");
return 0;
}
8. set容器排序
- 默认是从小到大,利用仿函数,可以改变规则
- 对于自定义数据类型,必须指定排序规则
- 创建后便不可改变排序规则
例一:set中存放内置数据类型
#include <iostream>
using namespace std;
#include <set>
#include <string>
//
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test()
{
//默认从小到大 创建了就不能改了
set<int>s;
s.insert(10);
s.insert(40);
s.insert(20);
s.insert(120);
s.insert(80);
for(set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl << "定排序规则为 从大到小: " << endl;
//指定排序规则为 从大到小
set<int,MyCompare>s1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(120);
s1.insert(80);
for(set<int,MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test();
system("pause");
return 0;
}
例二:存放自定义数据类型
#include <iostream>
using namespace std;
#include <set>
#include <string>
class Person
{
public:
Person(string name,int age):m_Name(name),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对象
Person p1("刘备",24);
Person p2("关羽",28);
Person p3("张飞",25);
Person p4("赵云",21);
//插入数据
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
//自定义的数据类型 都要指定排序规则
for(set<Person,comparePerson>::iterator it = s.begin(); it != s.end(); it++)
{
cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}