一、set基本概念
简介:所以元素都会在插入时自动被排序。
本质:set/multiset属于关联式容器,底层结构使用二叉树实现。
二、set构造和赋值
函数原型
构造函数:
set<T> st; //默认构造函数
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st); //重载等号操作符
三、set的大小和交换
函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st) //交换两个集合容器
四、插入和删除
函数原型
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所值的元素,返回下一个元素的迭代器。
erase(beg,end); //删除区间[beg,end]的所以元素,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
五、查找和统计
函数原型
find(key); //查找key是否存在,返回该键的元素的迭代器;若不存在,返回set.end();
cout(key); //统计key的元素个数
eg:
void test()
{
set<int> st;
st.insert(10);
st.insert(7);
st.insert(12);
st.insert(15);
st.insert(10);
st.insert(10);
set<int>::iterator pos = st.find(15); //返回值是该键的迭代器
if (pos != st.end()) {
cout << "找到了这个元素" << endl;
}
else {
cout << "未找到" << endl;
}
//统计10的个数(统计结果要么为0,要么为1);
int num = st.count(10);
cout << num << endl;
}
六、set和multisset的区别
①set不可以插入重复数据,而multiset可以。
②set插入数据的同时会插入结果,表示插入是否成功。
③multiset不会检测数据,因此可以插入重复数据
七、pair对组的创建
功能描述:成对出现的数据,利用对组可以返回两个数据
两种创建方式
pair<type,type> p (value1,value2);
pair<type,type> p=make_pair(value1,value2);
eg:
void test()
{
pair<string, int> p("小黄", 18);
//pair<string, int> p = make_pair("小白", 15);
cout << p.first << endl;
cout << p.second << endl;
}
八、set容器排序
set容器默认排序为从小到大,可以利用仿函数,改变排序规则
①set容器中存放int类型
class my_compare
{
public:
bool operator()(int v1, int v2)const
{
return v1 > v2;
}
};
void paixu(set<int, my_compare> &a)
{
for (set<int, my_compare>::iterator begin = a.begin(); begin != a.end(); begin++) {
cout << *begin << " ";
}
}
void test()
{
set<int, my_compare>s2;
//在插入数据前修改规则
s2.insert(10);
s2.insert(34);
s2.insert(20);
paixu(s2);
}
②set容器中存放自定义类型
#include <iostream>
#include <string>
#include <vector>
#include<deque>
#include<stack>
#include<list>
#include<set>
#include <algorithm>
using namespace std;
class person {
public:
person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
class my_compare
{
public:
bool operator()(person v1, person v2)const
{
return v1.age > v2.age;
}
};
void paixu(set<person, my_compare> &a)
{
for (set<person, my_compare>::iterator begin = a.begin(); begin != a.end(); begin++) {
cout << "姓名:" << (*begin).name << " 年龄:" << (*begin).age << endl;
}
}
void test()
{
set<person, my_compare>s2;
//在插入数据前修改规则
person p1("小黄", 15);
person p2("小明", 16);
person p3("小东", 13);
s2.insert(p1);
s2.insert(p2);
s2.insert(p3);
paixu(s2);
}
int main()
{
test();
system("pause");
return 0;
}