[1]set和multiset基本
集合分两种: 1.元素不允许重复set 2.元素允许重复 multiset,头文件都是#include<set>
[注意]默认从小到大排序,如果集合如果是自定义类型,一定要重载小于号
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
//集合 默认按照有小到大的次序排序好 1.元素不允许重复set 2.元素允许重复 multiset
//头文件都是#include<set>
set<int> a1;
multiset<int> b1;
vector<int> c1={1,2,3,1,2,3};
set<int> a2(c1.begin(),c1.end());//有三个值
multiset<int> b2(c1.begin(),c1.end());//有6个数
set<int>a3(a2);//拷贝构造函数
set<int>a4=a2;//拷贝构造函数
//[注意]如果集合如果是自定义类型,一定要重载小于号
return 0;
}
[2]使得set中元素从大到小排序
#include<iostream>
#include<functional>
#include<set>
using namespace std;
int main()
{
//自定义在set里面的排序
set<int> a1={2,3,4,5,3,3,4};
set<int,greater<int>> a2={2,3,4,5,3,3,4};//从大到小排序
return 0;
}
[3] .empty() .size() .count() .find()
#include<iostream>
#include<functional>
#include<set>
using namespace std;
int main()
{
set<int> a1={2,3,4,5,3,3,4};
set<int> a3={2,3,4,5,3,3,4};
set<int,greater<int>> a2={2,3,4,5,3,3,4};
cout<<a1.empty()<<endl;
cout<<a1.size()<<endl;
//支持比较(但是a1和a2不能比较)
cout<<(a1<a3)<<endl;
//count用法
cout<<a2.count(1)<<endl;
//iterator的find用法:指向该元素
set<int>::iterator p1=a1.find(3);
return 0;
}
[4]upper_bound, lower_bound和equal_range
#include<iostream>
#include<functional>
#include<set>
using namespace std;
int main()
{
//lower_bound
//upper_bound
set<int> a1={1,2,3,1,2,3,1,2,3,4};//1 2 3 4
multiset<int> a2={1,2,3,1,2,3,1,2,3,4};// 1 1 1 2 2 2 3 3 3 4
set<int>::iterator p2=a1.lower_bound(3);//返回第一个插入位置
set<int>::iterator p3=a1.upper_bound(3);//返回最后一个插入位置
return 0;
}
#include<iostream>
#include<functional>
#include<set>
#include<utility>//用pair的头文件
using namespace std;
int main()
{
//lower_bound
//upper_bound
set<int> a1={1,2,3,1,2,3,1,2,3,4};//1 2 3 4
multiset<int> b1={1,2,3,1,2,3,1,2,3,4};// 1 1 1 2 2 2 3 3 3 4
multiset<int>::iterator p1=b1.lower_bound(3);//指向第一个3
multiset<int>::iterator p2=b1.upper_bound(3);//指向最后一个3下一个位置
//equal_range(其实就是调用了lower_bound和upper_bound)
pair<int,char> c1;
c1.first=100;
c1.second='\n';//这里说明pair的用法
pair<multiset<int>::iterator,multiset<int>::iterator> pp;
pp=b1.equal_range(3);
//【等价】pp.first=b1.lower_bound(3); pp.second=b1.upper_bound(3);
for(multiset<int>::iterator p=pp.first;p!=pp.second;p++)
{
cout<<*p<<" ";
}
//显示所有的3
cout<<endl;
return 0;
}
[5] 赋值与.swap()
#include<iostream>
#include<functional>
#include<set>
using namespace std;
int main()
{
//赋值与.swap()
set<int> a1={1,2,3,4,5};
a1={8,9,0};
set<int> a2;
a2=a1;
a2={1,2,3,4};
a1.swap(a2);
return 0;
}
[6] iterator与vector类似,不赘述(非常量迭代子可以赋个常量迭代子之类的)
[7] 集合的插入 .insert(3) 的返回(set为pair,multi为指针)
#include<iostream>
#include<functional>
#include<set>
#include<utility>
using namespace std;
int main()
{
//a.insert(n).second
set<int> a1;
a1.insert(3);
a1.insert(5);
pair<set<int>::iterator,bool> pp1=a1.insert(3);
//insert本质是一个pair, bool表示插入成功或失败
cout<<pp1.second<<endl;
cout<<a1.insert(6).second<<endl;
//对于multiset来说,p没有bool() 因为100%插入成功
multiset<int> a2;
a2.insert(3);
a2.insert(3);
multiset<int>::iterator p=a2.insert(3);
cout<<*p<<endl;
return 0;
}
插入多个元素:#include<iostream>
#include<functional>
#include<vector>
#include<set>
#include<utility>
using namespace std;
int main()
{
//a.insert(新加多个元素)
set<int> a1;
vector<int> c1 ={1,2,3,4,6,6,6};
a1.insert(c1.begin(),c1.end());// a.insert(p1,p2)
a1.insert({5,7,8});// a.insert({2,3})
return 0;
}
[8]集合里面添加结构体:需要自己定义小于号
#include<iostream>
#include<functional>
#include<vector>
#include<set>
#include<utility>
using namespace std;
class Point
{
public:
Point(int _x,int _y,int _z)
{
x=_x;
y=_y;
z=_z;
}
int x;
int y;
int z;
bool operator<(const Point &p)const
{
return(this->x*this->x+this->y*this->y+this->z*this->z)<(p.x*p.x+p.y*p.y+p.z*p.z);
}
};
int main()
{
//集合里面添加结构体:需要自己定义小于号
Point a(3,4,5);
Point b(-2,-2,-2);
cout<<(a<b)<<endl;
set<Point> a1;
a1.insert(a);
a1.insert(b);
return 0;
}
另一种实现方式:函数对象#include<iostream>
#include<functional>
#include<vector>
#include<set>
#include<utility>
using namespace std;
class Point
{
public:
Point(int _x,int _y,int _z)
{
x=_x;
y=_y;
z=_z;
}
int x;
int y;
int z;
};
class MyCmp
{
public:
bool operator()(Point a, Point b)
{
return(a.x+a.y+a.z)<(b.x+b.y+b.z);
}
};
int main()
{
//集合里面添加结构体:需要自己定义小于号
Point a(3,4,5);
Point b(-2,-2,-2);
MyCmp m;
cout<<m(a,b)<<endl;
set<Point,MyCmp> a1;
a1.insert(a);
a1.insert(b);
return 0;
}
一个例子:字符串#include<iostream>
#include<functional>
#include<vector>
#include<set>
#include<utility>
using namespace std;
class MyCmp
{
public:
bool operator()(string a, string b)
{
return(a.size())<(b.size());
}
};
int main()
{
//集合里面添加结构体:需要自己定义小于号
set<string,MyCmp> a1={"jafn","fhajdshfjkaj","d"};
return 0;
}
[9]emplace也和之前一样
[10]元素的删除
#include<iostream>
#include<functional>
#include<vector>
#include<set>
using namespace std;
int main()
{
//a1.erase()
set<int> a1={3,4,5,6,7};
a1.erase(6);
//a1.erase(p1,p2);也符合
//a1.erase(p1);也符合
//集合元素清空
a1.clear();
a1={};//等价
return 0;
}
对于multiset,有点不一样
#include<iostream>
#include<functional>
#include<vector>
#include<set>
using namespace std;
int main()
{
//a1.erase()
multiset<int> a1={3,4,4,4,5,6,6,6,6,6,7};
a1.erase(6);//所有的6全部删除
//只删除一个元素:用指针
multiset<int>::iterator p=a1.find(4);
a1.erase(p);
for(set<int>::iterator p=a1.begin();p!=a1.end();p++)
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
[11]元素的交和并
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
#include<iterator>
#include<set>
using namespace std;
int main()
{
//两个集合的交与并
set<int> a1={1,2,3,4,5};
set<int> a2={3,1,2,6,7,8};
set<int> a3;
set<int> a4;
set_intersection(a1.begin(), a1.end(), a2.begin(), a2.end(),inserter(a3,a3.end()));//交
set_union(a1.begin(), a1.end(), a2.begin(), a2.end(),inserter(a4,a4.end()));//并
return 0;
}