set.h
#pragma once
#include<iostream>
#include<string>
#include<set>
using namespace std;
void set_construction();
void set_size();
void set_insert_del();
void set_find_count();
void set_multiset();
void set_pair();
void set_compare();
void set_compare_case();
set.cpp
#include"set_exercise.h"
// set 载入
set<int> input_set(set<int>& obj,int num)
{
for (int i = 0; i < num; i++)
{
obj.insert(i);// 插入数值
}
return obj;
}
// set 读取
void print_set(set<int>& obj)
{
for (set<int>::iterator i = obj.begin(); i != obj.end(); i++)
{
cout << *i << ",";
}
cout << endl;
}
// 构造函数
void set_construction()
{
// 构造函数
set<int> set_01;
set_01 = input_set(set_01, 10);
print_set(set_01);
// 拷贝构造函数
set<int> set_02(set_01);
print_set(set_02);
// 赋值
set<int> set_03;
set_03 = set_02;
print_set(set_03);
}
// set 大小
void set_size()
{
set<int> set_01;
set_01 = input_set(set_01, 10);
print_set(set_01);
cout << "Set里有" << set_01.size()<<"个元素" << endl;
if (set_01.empty())
{
cout << "set_01为空。" << endl;
}
else
{
cout << "set_01不为空。" << endl;
}
// 交换set
set<int> set_02;
set_02 = input_set(set_02, 5);
cout << "交换前:" << endl;
print_set(set_01);//0,1,2,3,4,5,6,7,8,9,
print_set(set_02);//0,1,2,3,4,
// 执行交换
set_01.swap(set_02);
cout << "交换后:" << endl;
print_set(set_01);//0,1,2,3,4,
print_set(set_02);//0,1,2,3,4,5,6,7,8,9,
}
// 插入和删除
void set_insert_del()
{
set<int> set_01;
// 插入
set_01.insert(10);
set_01.insert(20);
set_01.insert(30);
set_01.insert(40);
set_01.insert(50);
set_01.insert(60);
set_01.insert(70);
set_01.insert(80);
set_01.insert(90);
set_01.insert(100);
set_01.insert(110);
set_01.insert(120);
set_01.insert(130);
set_01.insert(140);
print_set(set_01);//10,20,30,40,50,60,70,80,90,100,110,120,130,140,
// 删除
set_01.erase(set_01.begin());// 删除首位元素//20,30,40,50,60,70,80,90,100,110,120,130,140,
set_01.erase(30);// 删除指定数值//20,40,50,60,70,80,90,100,110,120,130,140,
print_set(set_01);//
// 删除下标3位置的数值
set<int>::iterator it = set_01.begin();
for (int i = 0; i < 3; i++)// 偏移值为3
{
it++;
}
set_01.erase(it);// 删除下标3位置的数值
print_set(set_01);// 20,40,50,70,80,90,100,110,120,130,140,
// 删除下标0-2位置的数据
for (int i = 0; i < 3; i++)
{
set_01.erase(set_01.begin());
}
print_set(set_01);// 70,80,90,100,110,120,130,140,
// 删除指定区域段的元素
// 获取头部指针
set<int>::iterator it_01 = set_01.begin();
for (int i = 0; i < 1; i++)// 偏移值为1
{
it_01++;
}
// 获取尾部指针
set<int>::iterator it_02 = set_01.begin();
for (int i = 0; i < 4; i++)// 偏移值为4
{
it_02++;
}
// 删除下标1-3区间的值
set_01.erase(it_01, it_02);//
print_set(set_01);//70,110,120,130,140,
// 清空
//set_01.erase(set_01.begin(), set_01.end());
set_01.clear();//清空
print_set(set_01);
}
// 查找和统计
void set_find_count()
{
set<int> set_01;
set_01 = input_set(set_01, 10);
print_set(set_01);
// 查找
set<int>::iterator pos = set_01.find(30);
//cout << *pos << endl;// 如果找不到,会返回end()
if (pos != set_01.end())
{
cout << "找到了元素。" << endl;
}
else
{
cout << "没找到元素。" << endl;
}
// 统计
int num = set_01.count(3);// 统计set中有多少个值为 3 的元素,对于set而然只有两个结果,0或1,对于multiset意义比较大
cout << "统计:" << num<< endl;//1
}
// set和multiset
void set_multiset()
{
multiset<int> mset;
for (int i = 0; i < 10; i++)
{
mset.insert(i);//插入
}
mset.insert(2);// 插入2
for (multiset<int>::iterator i = mset.begin(); i != mset.end(); i++)
{
cout << *i << ",";//0,1,2,2,3,4,5,6,7,8,9,
}
cout << endl;
}
// 创建对组
void set_pair()
{
pair<string, int>p("Max", 30);
cout << "姓名:" << p.first << "年龄:" << p.second << endl;//
pair<string, int>p2 = make_pair("Song", 21);
cout << p2.first << p2.second << endl;
}
// set自定义排序从大到小
class MyCompare
{
public:
// 仿函数,设计为从大到小
bool operator()( int a, int b)const
{
return a > b;
}
};
// 自定义set排序
void set_compare()
{
set<int> s1;
s1.insert(10);
s1.insert(50);
s1.insert(30);
s1.insert(20);
s1.insert(40);
print_set(s1);// 10,20,30,40,50,(默认从小到大排序)
cout << endl;
// 用仿函数指定排序规则
set<int,MyCompare> s2;
s2.insert(10);
s2.insert(50);
s2.insert(30);
s2.insert(20);
s2.insert(40);
for (set<int,MyCompare>::iterator i = s2.begin(); i != s2.end(); i++)
{
cout << *i << ",";// 50,40,30,20,10,
}
cout << endl;
}
// set排序案例
class PersonA
{
public:
PersonA(string name,int age)
{
this->name = name;
this->age = age;
}
string name;
int age;
};
class ComparePerson
{
public:
bool operator()( PersonA p1, PersonA p2)const
{
return p1.age > p2.age;
}
};
void set_compare_case()
{
set<PersonA, ComparePerson> s1;
PersonA p1("刘备",43);
PersonA p2("诸葛亮",26);
PersonA p3("关羽",38);
PersonA p4("张飞",37);
PersonA p5("赵云",30);
PersonA p6("马超",26);
PersonA p7("黄忠",61);
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
s1.insert(p5);
s1.insert(p6);
s1.insert(p7);
// 年龄从大到小排序
for (set<PersonA,ComparePerson>::iterator i = s1.begin(); i != s1.end(); i++)
{
cout << "姓名:" << i->name << " 年龄:" << i->age << endl;
}
cout << endl;
}