一:基本概念
在插入元素的时候会自动排好序,比如插入的是1,3,4,2,打印是1,2,3,4.底层是通过二叉树结构实现的,set容器不允许有重复的元素,但是multiset允许有元素重复。
二:构造,遍历,赋值
#include <iostream>
#include <set>
using namespace std;
int main() {
//构造set
set<int> s;
s.insert(1);
s.insert(2);
s.insert(2);//插入一个重复的元素
s.insert(3);
s.insert(4);
//遍历
for (set<int>::iterator it = s.begin(); it!= s.end(); it++) {
cout<<*it;//打印结果1234自动排序,重复的不打印
}
//拷贝构造
set<int> s1(s);
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
cout << *it;//1234
}
//赋值
set<int> s3;
s3 = s1;
for (set<int>::iterator it = s3.begin(); it != s3.end(); it++) {
cout << *it;//1234
}
}
三:常见操作
1.容器大小、是否为空、交换容器
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(3);
s.insert(2);
//判断是否为空
if (!s.empty()) {
//大小
cout << s.size();
}
set<int> s2;
s2.insert(1);
s2.insert(3);
//交换
s.swap(s2);
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it;//313
}
cout << endl;
for (set<int>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it;//123
}
}
2.插入和删除
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(3);
s.insert(2);
//删除
s.erase(s.begin());
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it;//23
}
//删除重载
s.erase(2);
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it;//3
}
}
3.查找和统计
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(3);
s.insert(2);
set<int>::iterator it = s.find(2);
if (it != s.end()) {
cout << *it;//2
}
//统计3的个数。对于set这个结果始终是1或者0 但是multiset不一样
int num = s.count(3);
cout << num;
}
四:set和multiset区别
1.set允许插入重复元素,multiset不允许插入元素
2.set插入数据的同时会返回结果,表示插入成功
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
//插入成功,返回一个对组结构的数据pair
pair<set<int>::iterator,bool> ret =s.insert(1);
if (ret.second) {
cout << "第一次插入成功";
}
else {
cout << "插入失败";
}
}
3.multiset不会检测数据 因此可以插入重复元素
五:pair对组
1.对组的创建和定义
pair是c++中用来定义两个成对出现的数据
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main() {
//第一种创建方式
pair<string, int> p(string("aaa"), 1);
cout << p.first << p.second;//成对元素第一个用first第二个使用second
//第二种创建方式
pair<string, int> p1 = make_pair(string("aaa"), 1);
cout << p.first << p.second;
}
六:set中排序规则的指定
1.如果存放的是内置数据类型
#include <iostream>
#include <set>
#include <string>
using namespace std;
//通过自定义仿函数定义比较规则
class MyCompare
{
public:
bool operator()(int a, int b) const{
return a > b;//降序
}
};
int main() {
set<int, MyCompare>s;//引入仿函数
s.insert(30);
s.insert(20);
for (set<int, MyCompare>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it;
}
}
2.如果存放的是自定义数据类型
#include <iostream>标签:insert,set,cout,iterator,int,对组,C++,include From: https://blog.51cto.com/u_11334685/5741371
#include <set>
#include <string>
using namespace std;
class person {
public:
person(int age, string name) {
this->age = age;
this->name = name;
}
int age;
string name;
};
class MyComparePerson
{
public:
bool operator()(const person& p1, const person& p2) const{
return p1.age > p2.age;
}
};
int main() {
//set存放自定义数据类型要制定排序规则
set<person, MyComparePerson>s;
person p1(10, "aaa");
person p2(20, "bbb");
person p3(30, "ccc");
s.insert(p1);
s.insert(p2);
s.insert(p3);
for (set<person, MyComparePerson>::iterator it = s.begin(); it != s.end(); it++) {
cout << it->name;
}
}