1.set容器及multiset容器基础知识
2.set交换与大小
3.set容器插入与删除
4.set容器查找与统计
5.set与multiset容器的区别
6.pair对组的创建方式
7.set容器排序(改变排序规则)
———————————————————————————————————
1.set容器及multiset容器基础知识
set与multiset都是关联式容器,所有被插入时都会自动排序
set与multiset容器区别:
1.set不能再容器中有重复的数
2.multiset允许容器中有重复的元素
构造函数:
set< T > st
set(const set& st)
赋值:
operator= //赋值
set例子:
#include
using namespace std;
#include
void PrintSet(const set<int>&st)
{
for(set<int>::const_iterator it = st.begin();it!=st.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
void test()
{
set<int> st;
st.insert(20); //插入数据用insert
st.insert(10);
st.insert(30);
st.insert(40);
st.insert(30);
PrintSet(st);
set<int> st1(st); //拷贝构造
PrintSet(st1);
set<int> st2;
st2 = st1;
PrintSet(st2);
}
int main()
{
test();
system("pause");
return 0;
}
运行结果:
———————————————————————————————————
2.set交换与大小
size() //容量
empty(); //若是容器空为1,不空为0
swap() //交换容器
———————————————————————————————————
3.set容器插入与删除
insert() //插入
clear() //清除
erase(pos) //清除pos迭代器所指元素,返回下一个元素
erase(beg,end) //迭代器指向的区间
erase(elem) //删除容器中为elem的元素
例子:
#include
using namespace std;
#include
void PrintSet(const set<int>&st)
{
for(set<int>::const_iterator it = st.begin();it!=st.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
void test()
{
set<int> st;
st.insert(20); //插入数据
st.insert(10);
st.insert(30);
st.insert(40);
st.insert(30);
PrintSet(st); //遍历
//删除第一个数据
st.erase(st.begin());
PrintSet(st);
//删除重载 直接放入值
st.erase(30);
//清空
//st.erase(st.begin(),st.end());
st.clear();
PrintSet(st);
}
int main()
{
test();
system("pause");
return 0;
}
运行结果:
———————————————————————————————————
4.set容器查找与统计
find(key) //找到返回对应元素的迭代器,没有找到返回.end()
cout(key) //set容器中没有重复的数,所以返回0或1
例子:
#include
using namespace std;
#include
void test()
{
set<int> st;
st.insert(20); //插入数据
st.insert(10);
st.insert(30);
st.insert(30);
set<int>::iterator it = st.find(30); //find返回该位置的迭代器,没找到返回st.end()
if(it != st.end()) //判断是否相同
{
cout<<"找到对应的"<<(*it)<<endl;
}
else
{
cout<<"没找到"<<endl;
}
cout<<"30的数量为:"<<st.count(30)<<endl; //因为set中没有重复数,返回只有1或着0
}
int main()
{
test();
system("pause");
return 0;
}
运行程序:
———————————————————————————————————
5.set与multiset容器的区别
set插入数据时会返回插入的结果,结果表示插入是否成功
multiset不会检测数据,因此可以插入重复的数据
检验:
#include
using namespace std;
#include
void test()
{
set<int> st;
pair<set<int>::iterator,bool> ret = st.insert(20); //插入数据
if(ret.second)
{
cout<<"第一次插入成功"<<endl;
}
else
{
cout<<"插入失败"<<endl;
}
ret = st.insert(20);
if(ret.second)
{
cout<<"第二次插入成功"<<endl;
}
else
{
cout<<"插入失败"<<endl;
}
}
int main()
{
test();
system("pause");
return 0;
}
运行结果:
———————————————————————————————————
6.pair对组的创建方式
说明:成对成线的数据,利用对组可以返回两个数据
两种创建方式:
pair< type,type>p(value,value)
pair< type,typoe> p = make_pair(value,value)
例子:
#include
using namespace std;
#include
#include
//pair对组的创建
void test()
{
//第一种方式
pair<string,int> p("Tom",20);
cout<<"姓名:"<<p.first<<" 年龄:"<<p.second<<endl;
//第二种
pair<string,int>p1 = make_pair("小王",15);
cout<<"姓名:"<<p1.first<<" 年龄:"<<p1.second<<endl;
}
int main()
{
test();
system("pause");
return 0;
}
运行结果:
———————————————————————————————————
7.set容器排序(改变排序规则)
set容器默认插入时从小到大排序,如何改变排序规则?
利用仿函数,可以改变排序规则,必须在插入数之前确定排序方式
例子:
#include
using namespace std;
#include
#include
class Mycompare
{
public:
bool operator()(int v1,int v2) //创建一个带有bool类型的仿函数
{
return v1>v2;
}
};
//pair对组的创建
void test()
{
set<int,Mycompare> p; //加入自己创建的类
p.insert(10);
p.insert(30);
p.insert(20);
p.insert(15);
//遍历
for(set<int,Mycompare>::iterator it = p.begin();it!=p.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
int main()
{
test();
system("pause");
return 0;
}
若插入自定义数据,如何指定排序规则
例子:
#include
using namespace std;
#include
#include
//自定义类
class Person
{
public:
Person(string name,int age) //构造函数
{
this->m_name = name;
this->m_age = age;
}
string m_name;
int m_age;
};
class Mycompare
{
public:
bool operator()(const Person& p,const Person& p1) //创建一个带有bool类型的仿函数
{
return p.m_age>p1.m_age;
}
};
//pair对组的创建
void test()
{
set<Person,Mycompare> st; //创建容器
Person p("小明",15); //自定义数据
Person p1("小红",14);
Person p2("小王",16);
Person p3("小李",20);
st.insert(p);
st.insert(p1);
st.insert(p2);
st.insert(p3);
//遍历
for(set<Person,Mycompare>::iterator it = st.begin();it!=st.end();it++)
{
cout<<"姓名:"<<it->m_name<<" 年龄:"<<it->m_age<<endl;
}
}
int main()
{
test();
system("pause");
return 0;
}