目录
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
679

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



