所有元素都会在插入时自动被排序
set(集合)/multiset(多重集合)属于关联式容器,底层结构是用二叉树实现
set和multiset区别:
set不允许容器中有重复的元素,multiset允许容器中有重复的元素
set<int>s1;
set.insert(10);
set<int>s2(s1); //拷贝构造
s3=s2; //赋值
//set容器插入数据时用insert
s1.empty();
s1.size();
s1.swap(s2);
s1.insert(10);
//删除s1.begin()迭代器所指元素,返回下一个元素的迭代器
s1.erase(s1.begin());
s1.clear(); //清空
set<int>::iterator pos = s1.find(30);
if(pos != s1.end())
{
cout<<"找到了元素:"<<* pos<<endl;
}
else
{
cout<<"未找到元素"<<endl;
}
/*-----------------------------------------------*/
find(key); /*查找key是否存在,若存在,返回该键的元素的迭代器;
若不存在,返回set.end()*/
int num = s1.count(30); //统计key的元素个数
//对于set, count结果为0或1
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
成对出现的数据,利用对组可以返回两个数据
两种创建方式:
pair <type,type> p (value1,value2);
pair <type,type> p =make_pair(value1,value2);
pair<string,int>p ("Tom",20);
cout<<"姓名:"<<p.first<<"年龄:"<<p.second<<endl;
pair<string,int> p2 = make_pair("Jerry",20);
set容器默认排序规则为从小到大,掌握如何改变排序规则
利用仿函数,可以改变排序规则
/*第一种*/
class Mycompare
{
public:
bool operator() (int v1, int v2)
{
return v1>v2;
}
};
...
set<int,Mycompare>s2;
...
for(set<int,Mycompare>::iterator it = s2.begin();it!=s2.end(); it++)
{
cout<<*it<<"";
}
//set存放内置数据类型,利用仿函数可以指定set容器的排序规则
/*第二种*/
class Person
{
...
};
class Compareperson
{
public:
bool operator() (const Person& p1,const Person & p2)
{
return p1.m_Age > p2.m_Age;
}
};
...
for(set<Person, ComparePerson>::iterator it =s.begin();
it!=s.end();it++)
{
cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
}
//对于自定义数据类型,set必须指定排序规则才可以插入数据