一、set
1. 在 set 中,元素的 value 也标识它( value 就是key,类型为 T ),并且每个 value 必须是唯一的。set 中的元素不能在容器中修改(元素总是 const),但是可以从容器中插入或删除它们。
2. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set 中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
3. set 中的元素不可以重复(因此可以使用set进行去重)。
4. set 中的元素默认按升序排序,所以set 常用来排序和去重。
5. set 底层是用红黑树来实现的。
我们来看一下 set 模板参数声明:
1. T :set中存放元素的类型,实际在底层存储<value, value>的键值对。
2. Compare:set 中元素默认按照小于来比较。
3. Alloc:set 中元素空间的管理方式,使用STL提供的空间配置器管理。
set 的迭代器
与其他容器一样,set 也有 iterator 、const_iterator、reverse_iterator、const_reverse_iterator。关于迭代器我们不作过多说明,可以简单实现一个通过迭代器遍历函数(后面要用到)。
void print(set<T>& s)
{
set<T>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
set 的默认成员函数(构造、拷贝构造、赋值运算符重载)
函数声明 | 功能 |
| 构造空的set |
| 用[first,last)区间的元素构造set |
set (const set& x); | 拷贝构造 |
| 赋值运算符重载 |
注意:set 可以使用花括号的方式来初始化构造。
void testset1()
{
set<int> s1;
set<int> s2{
{ 2 }, { 4 }, { 1 }, { 1 },{ 6 }
, { 3 }, { 5 }, { 4 }
};
set<int> s3(s2);
set<int> s4(s2.begin(), s2.end());
s1 = s3;
print(s1);
print(s2);
print(s3);
print(s4);
}
程序运行结果:
set 的增删查改
函数声明 | 功能 |
| 在set中插入val,实际插入<val,val>键值对。返回值为pair:如果插入成功,返回一个<val的迭代器,true>;插入失败说明val已经存在,返回<val迭代器,false> |
| 在position位置插入val,实际插入<val,val>构成的键值对,position只是一个参考,不一定在该位置插入 |
| 在set中插入 [first,last)区间的元素 |
| 删除position位置上的元素 |
| 删除val 元素,返回删除元素个数 |
| |
| 交换两个set |
| 清空set |
| 查找值为val的元素,返回const_iterator |
| 返回set中值为val的元素个数 |
void testset2()
{
set<int> s1;
pair<set<int>::iterator, bool> ret;
int arr[] = { 5, 2, 5, 1, 4, 3 };
ret = s1.insert(3);
s1.insert(s1.find(2), 6);
s1.insert(arr, arr + 6);
print(s1);
cout << *(ret.first) << " " << ret.second << endl;
set<int> s2(s1);
s1.erase(s1.find(3));
s1.erase(5);
print(s1);
s1.swap(s2);
print(s1);
print(s2);
s1.clear();
print(s1);
cout << s2.count(2) << endl;
}
程序运行结果:
二、multiset
multiset 和 set 的使用基本一样,唯一不同的地方是 multiset 可以存在重复元素,我们简单了解一下即可:
void testmultiset()
{
multiset<int> s
{ { 3 }, { 4 }, { 2 }, { 2 },
{ 1 }, { 6 }, { 3 }, { 5 } };
multiset<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
程序运行结果: