set基本概念
简介:
所有元素都会在插入时自动被排序
本质:
set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复的元素
set构造和赋值
#include <iostream>
#include <set>
using namespace std;
void printSet(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(30);
s1.insert(20);
s1.insert(40);
printSet(s1);
//自动排序
//拷贝构造
set<int>s2(s1);
printSet(s2);
//赋值
set<int>s3;
s3 = s2;
printSet(s3);
}
int main()
{
test01();
return 0;
}
set大小和交换
#include <iostream>
#include <set>
using namespace std;
void printSet(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(30);
s1.insert(20);
s1.insert(40);
printSet(s1);
//自动排序
if(s1.empty())
{
cout << "空" << endl;
}
else
{
cout << "非空" << endl;
cout << "大小为:" << s1.size() << endl;
}
}
//交换
void test02()
{
set<int>s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
set<int>s2;
s2.insert(100);
s2.insert(300);
s2.insert(200);
s2.insert(400);
cout << "交换前:" << endl;
printSet(s1);
printSet(s2);
cout << "交换后:" << endl;
s1.swap(s2);
printSet(s1);
printSet(s2);
}
int main()
{
//test01();
test02();
return 0;
}
set插入和删除
#include <iostream>
#include <set>
using namespace std;
void printSet(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(30);
s1.insert(20);
s1.insert(40);
printSet(s1);
//删除
s1.erase(s1.begin()); //删除迭代器所指
printSet(s1);
s1.erase(30); //删除对应元素
printSet(s1);
//清空
// s1.erase(s1.begin(),s1.end()); //删除区间
s1.clear();
printSet(s1);
}
int main()
{
test01();
return 0;
}
set查找和统计
#include <iostream>
#include <set>
using namespace std;
void printSet(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(30);
s1.insert(20);
s1.insert(40);
printSet(s1);
//查找
set<int>::iterator pos = s1.find(30);
if(pos !=s1.end())
{
cout << "找到了元素" << *pos << endl;
}
else
{
cout << "未找到元素" << endl;
}
//统计
int num = s1.count(30);
cout << "num = " << num << endl;
}
int main()
{
test01();
return 0;
}
set和multiset区别
#include <iostream>
#include <set>
using namespace std;
void printSet(set<int> &s)
{
for(set<int>::iterator it = s.begin(); it != s.end() ; it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s;
//不可以插入
s.insert(10);
s.insert(10);
printSet(s);
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()
{
test01();
return 0;
}
pair对组创建
#include <iostream>
#include <set>
#include <string>
using namespace std;
//void printSet(set<int> &s)
//{
// for(set<int>::iterator it = s.begin(); it != s.end() ; it++)
// {
// cout << *it << " ";
// }
// cout << endl;
//}
void test01()
{
pair<string, int> p(string("Tom"),20);
cout << "姓名:" << p.first << "; 年龄:" << p.second << endl;
pair<string, int> p2 = make_pair("Jerry", 10);
cout << "姓名:" << p2.first << "; 年龄:" << p2.second << endl;
}
int main()
{
test01();
return 0;
}
set容器排序
#include <iostream>
#include <set>
using namespace std;
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test01()
{
set<int>s1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(30);
s1.insert(50);
//默认从小到大
for(set<int>::iterator it = s1.begin(); it != s1.end() ;it++)
{
cout << *it << " ";
}
cout << endl;
//指定排序规则
set<int, MyCompare> s2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(30);
s2.insert(50);
for(set<int>::iterator it = s2.begin(); it != s2.end() ;it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
return 0;
}