构造和赋值
/*
* 构造和赋值
*/
/*
* 简介:
* 所有元素都会在插入时自动被排序
*
* 本质:
* set/multiset属于关联式容器,底层是用二叉树实现
*
* set和mutiset区别:
* set不允许容器中有重复的元素
* mutiset允许容器中有重复的元素
*
*/
#include <iostream>
#include <set>
void printSet(std::set<int> &s)
{
for(auto e:s)
{
std::cout<<e<<" ";
}
std::cout<<std::endl;
}
void test01()
{
std::set<int> s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
s1.insert(30);
//遍历容器
//set容器特点:所有元素插入时会自动排序
//set容器不允许插入重复值
printSet(s1);
//拷贝构造
std::set<int> s2(s1);
printSet(s2);
//赋值
std::set<int> s3;
s3 = s2;
printSet(s3);
}
int main()
{
test01();
return 0;
}
大小和交换
/*
* 大小和交换
*/
#include <iostream>
#include <set>
void printSet(std::set<int> &s)
{
for(auto e:s)
{
std::cout<<e<<" ";
}
std::cout<<std::endl;
}
//大小
void test01()
{
std::set<int> s1;
//插入数据
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
printSet(s1);
//判断是否为空
if(s1.empty())
{
std::cout<<"s1 is empty"<<std::endl;
}
else
{
std::cout<<"s1 is not empty"<<std::endl;
std::cout<<s1.size()<<std::endl;
}
}
//交换
void test02()
{
std::set<int> s1;
//插入数据
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
std::set<int> s2;
//插入数据
s1.insert(100);
s1.insert(300);
s1.insert(200);
s1.insert(400);
std::cout<<"before swap:"<<std::endl;
printSet(s1);
std::cout<<std::endl;
printSet(s2);
s1.swap(s2);
std::cout<<"after swap: "<<std::endl;
printSet(s1);
std::cout<<std::endl;
printSet(s2);
}
int main()
{
// test01();
test02();
return 0;
}
插入和删除
/*
* 插入和删除
*/
#include <iostream>
#include <set>
void printSet(std::set<int> &s)
{
for(auto e:s)
{
std::cout<<e<<" ";
}
std::cout<<std::endl;
}
void test01()
{
std::set<int> s1;
//插入数据
s1.insert(30);
s1.insert(10);
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;
}
查找和统计
/*
* 查找和统计
*/
#include <iostream>
#include <set>
//查找
void test01()
{
std::set<int> s1;
//插入数据
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
auto pos = s1.find(30);
if(pos != s1.end())
{
std::cout<<"find the elment"<<std::endl;
}
else
{
std::cout<<"not found the element"<<std::endl;
}
}
//统计
void test02()
{
std::set<int> s1;
//插入数据
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
//统计30的个数
int num = s1.count(30);
//对于set而言,统计的结果要么是0,要么是1
std::cout<<"num: "<<num<<std::endl;
}
int main()
{
// test01();
test02();
return 0;
}
set和mutiset区别
/*
* set和mutiset区别
*/
/*
* 区别:
* set不可以插入重复数据,而mutiset可以
* set插入数据的同时会返回插入结果,表示插入是否成功
* mutiset不会检测数据,因此可以插入重复数据
*/
#include <iostream>
#include <set>
void test01()
{
std::set<int> s;
std::pair<std::set<int>::iterator, bool> ret = s.insert(10);
if(ret.second)
{
std::cout<<"successful in the first insert"<<std::endl;
}
else
{
std::cout<<"failed in the first insert"<<std::endl;
}
ret = s.insert(10);
if(ret.second)
{
std::cout<<"successful in the second insert"<<std::endl;
}
else
{
std::cout<<"failed in the second insert"<<std::endl;
}
std::multiset<int> ms;
//允许插入重复值
ms.insert(10);
ms.insert(10);
for(auto ele:ms)
{
std::cout<<ele<<" ";
}
std::cout<<std::endl;
}
int main()
{
test01();
return 0;
}
set内置类型指定排序规则
/*
* set内置类型指定排序规则
*/
/*
* 学习目标:
* set容器默认排序规则为从小到大,掌握如何改变排序规则
*
* 主要技术点:
* 利用仿函数,可以改变排序规则
*
*/
#include <iostream>
#include <set>
class myCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test01()
{
std::set<int> s1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(50);
s1.insert(30);
for(auto elem:s1)
{
std::cout<<elem<<" ";
}
std::cout<<std::endl;
//指定排序规则为从大到小
std::set<int, myCompare> s2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(50);
s2.insert(30);
for(auto elem:s2)
{
std::cout<<elem<<" ";
}
std::cout<<std::endl;
}
int main()
{
test01();
return 0;
}
自定义数据类型指定排序规则
/*
* 自定义数据类型指定排序规则
*/
#include <iostream>
#include <set>
class Person
{
public:
Person(std::string name, int age)
{
m_name = name;
m_age = age;
}
std::string m_name;
int m_age;
};
class comparePerson
{
public:
bool operator()(const Person& p1, const Person& p2)
{
return p1.m_age > p2.m_age;
}
};
void test01()
{
//自定义数据类型 都会指定排序规则
std::set<Person, comparePerson> s;
//创建对象
Person p1("liubei", 24);
Person p2("guanyu", 28);
Person p3("zahngfei", 25);
Person p4("zhaoyun", 21);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for(auto elem:s)
{
std::cout<<"name: "<<elem.m_name<<" age: "<<elem.m_age<<std::endl;
}
}
int main()
{
test01();
return 0;
}