插入时自动排序,不允许有重复元素,set和multiset属于关联式容器,底层数据结构是二叉树,multiset可以有重复元素。
需要引入头文件#include
默认构造
set<int> s1;
拷贝构造
set<int> s2(s1);
赋值
operator=
代码示例
void printSet(set<int> &s) {
for (set<int>::iterator it = s.begin(); it != s.end();it++) {
cout << *it << " ";
}
cout << endl;
}
void testSet01() {
//默认构造
set<int> s1;
//所有元素插入时候自动排序
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
s1.insert(60);
printSet(s1);//10 20 30 40 50 60
//拷贝构造
set<int> s2(s1);
printSet(s2);//10 20 30 40 50 60
set<int> s3;
//赋值
s3 = s2;
printSet(s3);//10 20 30 40 50 60
}
代码示例
void testSet02() {
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
printSet(s1);//10 20 30
if (!s1.empty()) {
cout << "set元素个数" << s1.size() << endl;
}
else {
}
set<int> s2;
s2.insert(100);
s2.insert(101);
s2.insert(102);
printSet(s2);//100 101 102
s1.swap(s2);
printSet(s1);//100 101 102
printSet(s2);//10 20 30
}
代码示例
void testSet03() {
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);//10 20 30 40
//删除
s1.erase(s1.begin());
printSet(s1);//20 30 40
s1.erase(30);
printSet(s1);//20 40
//清空
s1.erase(s1.begin(),s1.end());
//清空
s1.clear();
}
代码示例
void testSet04() {
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);//10 20 30 40
set<int>::iterator pos = s1.find(10);
if(pos != s1.end()){
cout << "找到元素" << *pos << endl;//找到元素10
}
else {
cout << "未找到元素" << endl;
}
cout<<"统计元素个数"<< s1.count(40) << endl;//统计元素个数1
代码示例
void testSet05() {
set<int> s1;
// pair
pair<set<int>::iterator, bool> ret = s1.insert(10);
if (ret.second) {
cout << "插入成功" << endl;
}
else {
cout << "插入失败" << endl;
}
pair<set<int>::iterator, bool> ret1 = s1.insert(10);
if (ret1.second) {
cout << "插入成功" << endl;
}
else {
cout << "插入失败" << endl;
}
printSet(s1);//10 20 30 40
multiset<int> s2;
//iterator
s2.insert(30);
s2.insert(30);
//30 30
for (multiset<int>::iterator it = s2.begin(); it != s2.end();it++) {
cout << *it <<" ";
}
cout<<endl;
}
成对出现的数据,利用对组可以返回两个数据。
void testSet06() {
pair<string, int> p("jack", 10);
cout << "姓名:" << p.first << " 年龄:" << p.second<<endl; //姓名:jack 年龄:10
pair<string, int> p2 = make_pair("jack", 10);
cout << "姓名:" << p2.first << " 年龄:" << p2.second << endl; //姓名:jack 年龄:10
}
set容器默认排序规则是从小到大,利用仿函数可以改变排序规则。
set存放内置数据类型
class MyCompare {
public :
//重载小括号
bool operator()(int v1,int v2) const
{
return v1 > v2;
}
};
void testSet07() {
set<int> s1;
s1.insert(10);
s1.insert(60);
s1.insert(30);
s1.insert(40);
s1.insert(20);
printSet(s1);//10 20 30 40 60 默认排序
//指定排序规则 从大到小
set<int, MyCompare> s2;
s2.insert(10);
s2.insert(60);
s2.insert(30);
s2.insert(40);
s2.insert(20);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it << " ";// 60 40 30 20 10
}
cout << endl;
}
bool operator()(int v1,int v2) const 如果不加const会报
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C3848 具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)” Containers D:\Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xutility 1455
set存放自定义数据类型
class Person {
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
class comparePerson {
public:
bool operator()(const Person& p1, const Person& p2) const{
//按照年龄降序
return p1.age > p2.age;
}
};
void testSet08() {
//自定义数据类型 需要指定排序规则 否则会报以下问题
set<Person, comparePerson> s;
Person p1("刘备",55);
Person p2("关羽", 33);
Person p3("张飞", 32);
s.insert(p1);
s.insert(p2);
s.insert(p3);
for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++) {
cout << "姓名:" << it->name << " 年龄:" << it->age<<endl;
//姓名:刘备 年龄:55
//姓名:关羽 年龄:33
//姓名:张飞 年龄:32
}
//严重性 代码 说明 项目 文件 行 禁止显示状态
//错误 C2676 二进制“ < ”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换 Containers D : \Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xstddef 117