
注意:
我们来看看为什么 set 中的元素是不能被修改的!
我们先来看看尝试修改 set 中的元素会不会报错吧!
看到这个报错的提示,你可能会认为 set 底层对存储的数据加上了 const 修饰,然而 C++ 库中的实现并不是这个样子呢!我们来看看源码:
我们可以看到,无论是 const 类型的迭代器还是非 const 类型的迭代器,其实都是 const 类型的迭代器!刚那句这个现象,如果你能够不通过迭代器访问 set 中的元素,还是可以修改的!但是并不建议这么做,
Effective c++中也是这么说的。
set 的使用和 map 差不多!set 支持使用一段迭代器区间来初始化,区间的范围是左开右闭!
#include
#include
#include
using namespace std;
int main()
{
vector<int> a({1,7,6,3,8,5,2,4});
set<int> s(a.begin(), a.end());
//输出:1 2 3 4 5 6 7 8
for(auto e : s)
cout << (e) << " ";
cout << endl;
return 0;
}
但是在平时刷算法题的时候,还是比较喜欢使用无参构造。
向 set 中插入一个元素。如果插入成功,那么返回值 pair 的 first 就是插入元素对应的迭代器,second 就是 true;如果插入失败,返回值 pair 的 first 就是原 set 中 val 值与插入节点的 val 值相等的元素对应的迭代器,second 就是 false。
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(3); //第二次插入 3 会失败,返回 set 中与 3 相等的元素对应的迭代器
s.insert(4);
return 0;
}
删除 set 中值为 val 的节点(set 的底层就是红黑树嘛)。返回删除的节点个数,因为 set 中不存在重复的元素,因此返回值不是 0 就是 1。
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
cout << s.erase(3) << endl; //输出:1
cout << s.erase(3) << endl; //输出:0
return 0;
}
统计一个 set 中值为 val 的节点的个数。因为 set 中不存在重复的元素,因此返回值不是 1 就是 0。
在 set 中查找值为 val 的节点,查找成功返回对应节点的迭代器,查找失败返回 end 迭代器。
返回 set 是否为空,为空返回 true,反之返回 false。
返回 set 中节点的个数。
删除 set 中的所有节点。
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
cout << s.count(1) << endl; //输出:1
cout << s.count(0) << endl; //输出:0
cout << *(s.find(1)) << endl; //输出:1
cout << s.empty() << endl; //输出:0
cout << s.size() << endl; //输出:4
s.clear();
cout << s.size() << endl; //输出: 0
return 0;
}
