目录
set
set
是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set
内部通常采用 红黑树 实现。平衡二叉树 的特性使得 set
非常适合处理需要同时兼顾查找、插入与删除的情况。
和数学中的集合相似,set
中不会出现值相同的元素。如果需要有相同元素的集合,需要使用 multiset
。multiset
的使用方法与 set
的使用方法基本相同。
所以, multiset
支持重复元素并排序。
用法
insert(x)
当容器中没有等价元素的时候,将元素 x 插入到set
中。erase(x)
删除值为 x 的 所有 元素,返回删除元素的个数。erase(pos)
删除迭代器为 pos 的元素,要求迭代器必须合法。erase(first,last)
删除迭代器在范围内的所有元素。
clear()
清空set
。
自定义比较方式
set
在默认情况下的比较函数为。然而在某些特殊情况下,我们希望能自定义 set
内部的比较方式。
这时候可以通过传入自定义比较器来解决问题。
具体来说,我们需要定义一个类,并在这个类中重载运算符。
例如,我们想要维护一个存储整数,且较大值靠前的 set
,可以这样实现:
unordered_set
又有人问了
我不想让他排序怎么办?
直接重载成空气得了
这时,unordered_set来了!!!
自 C++11 标准起,四种基于哈希实现的无序关联式容器正式纳入了 C++ 的标准模板库中,分别是:unordered_set
,unordered_multiset
,unordered_map
,unordered_multimap
。
unordered_set
它可以去重,至于unordered_multiset
嘛它没啥用
Tips
在 C++11 之前,无序关联式容器属于 C++ 的 TR1 扩展。所以,如果编译器不支持 C++11,在使用时需要在头文件的名称中加入tr1/
前缀,并且使用std::tr1
命名空间。如#include <unordered_map>
需要改成#include <tr1/unordered_map>
;std::unordered_map
需要改为std::tr1::unordered_map
(如果使用using namespace std;
,则为tr1::unordered_map
)。
(用法同上)
实例
#include <bits/stdc++.h>
using namespace std;
int main()
{
//排序
//输入数字
int n;
cin >> n;
//定义multiset
multiset<int> A;
int s;
//输入
for (int i = 0;i < n; i++)
cin >> s, A.insert(s);
//已排序,输出
for (int i : A)
cout << i << " ";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 声明一个整型 set 容器
set<int> mySet;
// 插入元素
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
mySet.insert(40);
// 输出 set 中的元素
cout << "Set contains: ";
for (int num : mySet)
cout << num << " ";
cout << std::endl;
// 查找元素
if (mySet.find(20) != mySet.end())
cout << "20 is in the set." << std::endl;
else
cout << "20 is not in the set." << std::endl;
// 删除元素
mySet.erase(20);
// 再次输出 set 中的元素
cout << "After erasing 20, set contains: ";
for (int num : mySet)
cout << num << " ";
cout << endl;
// 检查 set 是否为空
if (mySet.empty())
cout << "The set is empty." << endl;
else
cout << "The set is not empty." << endl;
// 输出 set 中元素的数量
cout << "The set contains " << mySet.size() << " elements." << endl;
return 0;
}
好了,所有都讲完了。
喜欢就点个关注吧!qwq