1. set基本概念
简介:
所有元素都会在插入时自动排序
本质:
set/multiset属于关联式容器,底层结构是用二叉树实现
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复的元素
2. 构造和赋值
与前面的容器无差异
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(30);
s1.insert(20);
//遍历
//容器特点:所有元素插入时候自动排序
//set容器不允许插入重复元素(但不报错)
showPrint(s1);
//拷贝构造
set<int>s2(s1);
showPrint(s2);
//赋值操作
set<int>s3;
s3 = s2;
showPrint(s3);
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
3. set大小和交换
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//大小
void test01() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
if (!s1.empty()) {
cout << "s1不为空" << endl;
cout << "s1的大小为:" << s1.size() << endl;
}
else {
cout << "s1为空" << endl;
}
showPrint(s1);
}
//交换
void test02() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
set<int> s2;
//插入数据只有insert方式
s2.insert(100);
s2.insert(400);
s2.insert(300);
s2.insert(200);
cout << "交换前:" << endl;
showPrint(s1);
showPrint(s2);
cout << "交换后:" << endl;
s1.swap(s2);
showPrint(s1);
showPrint(s2);
}
int main(int argc,char**argv) {
//test01();
test02();
system("pause");
return 0;
}
4. set插入和删除
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
showPrint(s1);
//删除
s1.erase(s1.begin());
showPrint(s1); //就算第一个数是40 第二个数是10 删掉的也仍然是10,排序后才删的
//删除重载
s1.erase(30); //指名道姓
//清空
s1.erase(s1.begin(), s1.end());
s1.clear(); //选一个吧
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
5. set查找和统计
find(key) 查找key是否存在,存在返回迭代器下标,不存在则返回set.end()
count(key) 统计key的元素个数
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//查找
void test01() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
showPrint(s1);
set<int>::iterator pos = s1.find(30);
if (pos != s1.end()) {
cout << "找到元素" <<*pos<< endl;
}
else {
cout << "未找到元素" << endl;
}
}
//统计
void test02() {
set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
showPrint(s1);
int num = s1.count(30);
//对于set而言 统计结果要么是0 要么是1
cout << "num= " << num << endl;
}
int main(int argc,char**argv) {
//test01();
test02();
system("pause");
return 0;
}
6. set和multiset的区别
set不可以重复插入数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
set<int> s1;
pair<set<int>::iterator, bool> ret = s1.insert(10);
if (ret.second) {
cout << "第一次插入成功" << endl;
}
else {
cout << "第一次插入失败" << endl;
}
ret = s1.insert(10);
if (ret.second) {
cout << "第二次插入成功" << endl;
}
else {
cout << "第二次插入失败" << endl;
}
multiset<int>ms;
//允许插入重复值
ms.insert(10);
ms.insert(10);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
7. pair对组创建
功能描述:成对出现的数据,利用对组可以返回两个数据
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
//第一种方式
pair<string, int>p("tom", 20);
cout << "姓名: " << p.first << " 年龄: " << p.second << endl;
//第二种方式
pair<string, int>p2 = make_pair("Jerry", 30);
cout << "姓名: " << p2.first << " 年龄: "<< p2.second << endl;
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
8. set容器排序
set默认排序从小到大,掌握如何改变排序规则
主要技术点:
利用仿函数,可以改变排序规则
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
class myCompare {
public:
bool operator()(int v1, int v2)const { //vs2019中重载()需要在后面+const!
return v1 > v2;
}
};
void showPrint(set<int>& s) {
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01() {
set<int>s1;
s1.insert(10);
s1.insert(50);
s1.insert(40);
s1.insert(20);
s1.insert(30);
showPrint(s1);
//指定排序规则从大到小
set<int,myCompare>s2;
s2.insert(10);
s2.insert(50);
s2.insert(40);
s2.insert(20);
s2.insert(30);
for (set<int,myCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
9. set存放自定义数据类型
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
class Person {
public:
Person(string name,int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
class myCompare {
public:
bool operator()(const Person& p1, const Person& p2)const { //别忘了加const!!
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void test01() {
set<Person,myCompare>s;
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,myCompare>::iterator it = s.begin(); it != s.end(); it++) {
cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
}
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}