1、set基本概念
简介:所以元素在插入时被自动排序
本质:set、multiset属于关联式容器,底层结构用的是二叉树实现
set和multiset区别:
2、set构造与赋值
函数原型:
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void test01()
{
set s;
s.insert(10);
s.insert(500);
s.insert(30);
s.insert(40);
s.insert(30);
printset(s);//10 30 40 500
set s2;
s2 = s;
printset(s2);//10 30 40 500
set s3(s);
printset(s3);//10 30 40 500
}
int main()
{
test01();
system("pause");
return 0;
}
3、set大小和交换
函数原型:
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void test01()
{
set s;
s.insert(10);
s.insert(500);
s.insert(30);
s.insert(40);
s.insert(30);
printset(s);//10 30 40 500
set s2;
s2.insert(1);
s2.insert(56);
s2.insert(32);
s2.insert(41);
s2.insert(100);
printset(s2); //1 32 41 56 100
if (s2.empty())//!kong
{
cout << "kong" << endl;
}
else
{
cout << "!kong" << endl;
}
cout << s.size() << endl;//4
cout << s2.size() << endl;//5
s.swap(s2);
printset(s);//1 32 41 56 100
printset(s2);//10 30 40 500
}
int main()
{
test01();
system("pause");
return 0;
}
4、set插入与删除
函数原型:
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void test01()
{
set s;
s.insert(10);
s.insert(500);
s.insert(30);
s.insert(40);
s.insert(70);
s.insert(45);
s.insert(63);
s.insert(87);
s.insert(81);
printset(s);//10 30 40 45 63 70 81 87 500
s.erase(s.begin());
printset(s); //30 40 45 63 70 81 87 500
s.erase(40);
printset(s); //30 45 63 70 81 87 500
}
int main()
{
test01();
system("pause");
return 0;
}
5、set查找和统计
函数原型:
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void test01()
{
set s;
s.insert(10);
s.insert(500);
s.insert(30);
s.insert(40);
s.insert(70);
s.insert(45);
s.insert(63);
s.insert(87);
s.insert(81);
printset(s);//10 30 40 45 63 70 81 87 500
set::iterator pos = s.find(400);
if (pos != s.end())//没找到
{
cout << *pos << endl;
}
else
{
cout << "没找到" << endl;
}
int num = s.count(80);
cout << num << endl;// 0
}
int main()
{
test01();
system("pause");
return 0;
}
6、set和multiset区别
区别:
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void printmultiset(multiset &st)
{
for (multiset::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
void test01()
{
set s;
s.insert(10);
pair::iterator, bool> ret = s.insert(20);
if (ret.second)
{
cout << "插入成功" << endl;
}
else
{
cout << "插入失败" << endl;
}
ret = s.insert(20);
if (ret.second)
{
cout << "插入成功" << endl;
}
else
{
cout << "插入失败" << endl;
}
printset(s);//10 30 40 45 63 70 81 87 500
multiset ms;
ms.insert(10);
ms.insert(20);
ms.insert(10);
printmultiset(ms);
}
int main()
{
test01();
system("pause");
return 0;
}
插入成功
插入失败
10 20
10 10 20
请按任意键继续. . .
7、pair对组创建
功能:成对出现的数据,可以利用对组返回两个数据
函数原型:
void test02()
{
pair p("Tom", 20);
cout << p.first << " " << p.second<< endl;
pair p1 = make_pair("jerry", 10);
cout << p1.first << " " << p1.second << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
8、set容器排序
目标:set容器默认从小到大排序,如何改变排序规则
方法:利用仿函数,可以改变排序规则
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << *sit << " ";
}
cout << endl;
}
class mycompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test01()
{
set s;
s.insert(10);
s.insert(20);
s.insert(5);
s.insert(56);
s.insert(23);
s.insert(28);
s.insert(67);
s.insert(51);
printset(s);//5 10 20 23 28 51 56 67
set s1;
s1.insert(10);
s1.insert(20);
s1.insert(5);
s1.insert(56);
s1.insert(23);
s1.insert(28);
s1.insert(67);
s1.insert(51);
for (set::iterator sit = s1.begin(); sit != s1.end(); sit++)
{
cout << *sit << " ";//67 56 51 28 23 20 10 5
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
案例1
#include
#include
#include
#include
#include
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;
class person
{
public:
person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
string m_name;
int m_age;
};
void printset(set &st)
{
for (set::iterator sit = st.begin(); sit != st.end(); sit++)
{
cout << (*sit).m_name << " " << (*sit).m_age << " " ;
}
cout << endl;
}
class mycompare
{
public:
bool operator()(const person p1, person p2)
{
return p1.m_age > p2.m_age;
}
};
void test01()
{
//自定义数据类型要指定排序规则
set s;
person p1("张飞", 20);
person p2("关羽", 28);
person p3("刘备", 45);
person p4("曹操", 30);
person p5("赵云", 18);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
for (set::iterator sit = s.begin(); sit != s.end(); sit++)
{
cout << sit->m_name << " " << sit->m_age << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}