所有的元素都会在插入时自动被排序。
set容器与multiset容器本质在底层结构是二叉树,头文件均为#include <set>
set容器与multiset容器有什么区别?
set容器不允许容器中有重复的元素。
multiset容器允许容器有重复的元素。
#include <iostream>
using namespace std;
#include <set> //set/multiset
void printSet(set<int> &s)
{
//遍历输出
for(set<int>::iterator it = s.begin();it!=s.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
int main(int argc,char *argv[])
{
set<int> s; //默认构造
s.insert(20);
s.insert(50); //在容器中插入元素
s.insert(10);
s.insert(40);
s.insert(30);
printSet(s);
set<int> s2(s); //拷贝构造函数
printSet(s2);
set<int> s3;
s3 = s2; //重载等号操作符
printSet(s3);
if( s3.empty() ) //判断容器是否为空
{
cout << "s3为空" << endl;
}
else{
cout << "s3不为空" << endl;
cout << "s3.size() = " << s3.size() << endl; //返回容器中元素的数目
}
set<int> s4;
s4.insert(100); //在容器中插入元素
s4.insert(300);
s4.insert(400);
s4.insert(200);
s4.insert(500);
cout << "交换前:" << endl;
printSet(s3);
printSet(s4);
s3.swap(s4); //交换两个集合容器
cout << "交换后:" << endl;
printSet(s3);
printSet(s4);
//s4.clear(); //清除所有元素
//printSet(s4);
//s4.erase(s4.begin(),s4.end()); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
//printSet(s4);
set<int>::iterator it = s4.begin();
it++;
s4.erase(it,s4.end());
printSet(s4);
set<int>::iterator sit = s3.find(200);
//查找是否存在,若存在,返回该元素的迭代器,若不存在,返回
if(sit != s3.end())
{
cout << *sit << endl;
}
else{
cout << "未找到!" << endl;
}
int num = s3.count(200); //统计元素的个数 0或1 (set容器不允许容器中有重复的元素)
cout << "num = " << num << endl;
return 0;
}
- set构造和赋值
构造
set<T> st; //默认构造函数
set(const set &set); //拷贝构造函数
赋值:
set& operator=(const set &set); //重载等号操作符
大小与交换
size(); //返回容器中元素的数目。
empty(); //判断容器是否为空。
swap(); //交换两个集合容器。
插入与删除
insert(elem); //在容器中插入元素
clear(); //清楚所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
查找与统计
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器,若果不存在,返回set.end();
count(key); //统计key元素的个数。
set容器的排序 --- set容器存放内置数据类型。
set容器默认排序规则从小到大,掌握如何改变排序规则。
主要技术点:
利用仿函数,可以修改排序规则
由于()运算符重载后使用方式非常像函数的调用,因此称为仿函数。
#include <iostream>
using namespace std;
#include <set> /*set/multiset (multi)多重*/
//set容器的降序
class MyCompare{
public:
bool operator()(int v1,int v2)
{
//降序:让第一个数字大于第二个数字
return v1 > v2;
}
};
void printSet(set<int,MyCompare> &s)
{
for(set<int,MyCompare>::iterator sit = s.begin();sit!=s.end();sit++)
{
cout << *sit << " ";
}
cout << endl;
}
int main(int argc,char *argv[])
{
//set<int> s1; //默认排序的规则是升序
//s1.insert(40);
//s1.insert(20);
//s1.insert(10);
//s1.insert(50);
//s1.insert(30);
//printSet(s1);
set<int,MyCompare> s2;
//插入之后,已经默认的排序规则从小到大,所以必须要在插入数据之前,就要告诉它排序的规则是什么
s2.insert(40);
s2.insert(30);
s2.insert(20);
s2.insert(50);
s2.insert(10);
printSet(s2);
return 0;
}
set容器的排序 --- 存放自定义数据类型
#include <iostream>
using namespace std;
#include <set>
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 &p1,const Person &p2)
{
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void printSet(set<Person,MyCompare> &s)
{
//迭代器
for(set<Person,MyCompare>::iterator it = s.begin();it!=s.end();it++)
{
cout << "姓名:" << (*it).m_Name << "年龄:" << it->m_Age << endl;
}
}
int main(int argc,char *argv[])
{
set<Person,MyCompare> s;
Person p1("张三",30);
Person p2("关羽",20);
Person p3("孙悟空",10);
Person p4("ggy",40);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
printSet(s);
return 0;
}
对于自定义数据类型,如果不指定规则,是无法插入数据
本文详细介绍了C++标准库中的set与multiset容器的使用方法,包括构造与赋值、大小与交换、插入与删除等操作,并通过示例展示了如何自定义排序规则。
8321

被折叠的 条评论
为什么被折叠?



