STL中set和multiset容器的用法(轻松易懂~)
目录
1. 基本概念
? ? ? ? set和multiset属于关联式容器,底层结构式二叉树,所有元素都会在插入时自动排序。
如果你对容器的概念,或是二叉树不太了解,可以快速浏览一下下面这两篇文章:
C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用-CSDN博客
数据结构入门————树(C语言/零基础/小白/新手+模拟实现+例题讲解)-CSDN博客
? ? ? ? set和muliset 的区别是什么呢?
? ? ? ? set不允许插入重复的数据元素
? ? ? ? multiset允许插入重复的数据元素
? ? ? ? 我们先写一段代码,展示set容器插入和打印,下面这段代码,你不需要先出来,只需要看懂大概即可,部分不了解,下面都会有讲解。
set<int> s;
//插入3个元素,
s.insert(10);
s.insert(30);
s.insert(20);
for(set<int>::iterator it = s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
//打印: 10 20 30
? ? ? ? ser容器的迭代器的写法就是:set<T>::iterator?
? ? ? ? 上面这段代码,我们先插入了10,30,20,最后打印却是10 20 30,这是因为set容器默认将插入的数据从小到大排序,当然这是针对内置数据类型。如果想要从大到小,或者排序自定义数据类型,下面会有所讲解。
? ? ? ? 下面介绍set容器的接口,都是先展示函数原型,在展示代码应用。
2. 构造和赋值
set<T> s;? ? ? ? ? ? ? ? ? ? ?//默认构造
set(const set& s);? ? ? ? //拷贝构造
set& operator=(const set& s);? ? ? ? //重载了等号操作符
set<int> s1;
set<int> s2(s1);
set<int> s3;
s3 = s1;
3. 大小和交换
size();? ? ? ? //返回容器中元素的数目
empty();? ? ? ? //判断容器是否为空
swap(st);? ? ? //交换两个集合容器
set<int> s;
s.insert(10);
s.insert(20);
cout<<s.size()<<endl;
set<int> s1;
s1.insert(20);
s1.insert(30);
cout<<s1.size()<<endl;
s1.swap(s);
//s1 = 10 , 20
//s = 20 , 30
4. 插入 和 删除
insert(value);? ? ? ? //插入元素value
erase(pos);??? ? ? ? //删除pos位置的值
erase(beg,end);? ? ? ? //删除区间[beg,end)内的数据
erase(value);? ? ? ? //删除元素value
clear();? ? ? ? ? ? ? ? ?//清楚容器所有元素? ? ? ??
set<int> s;
s.insert(10);
s.insert(20);
s.insert(30);
s.erase(s.begin());
s.erase(20);
s.erase(s.begin(),s.end()); //等价于s.clear();
5. 统计 和 查找
find(key);? ? ? ? //查找key是否存在,存在返回该元素的迭代器,不存在返回end();
cunt(key);? ? ? ?//统计key的元素个数
set<int> s;
s.insert(10);
set<int>::iterator pos = s.find(20);
if(pos == s.end())
{
cout<<"找不到元素";
}
else
{
cout<<"找到了该元素";
}
cout<<s.count(10)<<endl;
? ? ? ? 对于set来说,key的元素个数要么为0,要么为1,不可能大于1,而multiset元素个数可以大于等于1。
6. set容器的排序
? ? ? ? 对于set容器,默认是从小到大排序,如果我们想要从大到小排序呢?这里就要用到仿函数。
class MyCompare()
{
public:
bool operator(int v1 ,int v2) const
{
return v1 > v2;
}
}
set<int, MyCompare> s;
s.insert(10);
s.insert(20);
s.insert(30);
for(set<int, MyCompare>::iterator it = s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
? ? ? ? 最后打印的结果就是:30 20 10。这只是对于内置数据类型的排序,还有自定义数据类型的排序。
? ? ? ? 对于自定义的数据类型,要使用自定义排序,否则,可能编译不过。
struct person
{
person(string n, int a)
{
this->name = n;
this->age = a;
}
string name;
int age;
};
struct compare_name
{
bool operator()(person p1, person p2) const
{
return p1.age > p2.age;
}
};
person p1("lxp", 19);
person p2 = { "ajm",20 };
set<person, compare_name> s;
s.insert(p1);
s.insert(p2);
for (set<person, compare_name>::iterator it = s.begin();it != s.end();it++)
{
cout << "name = " << it->name << " " << "age = " << it->age << endl;
}
? ? ? ? 以上,我们就简单的对set容器有了了解,当然,这也只是STL中set容器简单的一部分,日后,我会在专栏中更新更多更复杂的内容,欢迎大家一起学习。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!