【笔记】C++的set容器

前言

C++的set容器与multiset容器学习笔记

set和multiset属于关联式容器,在插入元素时会自动排序
set和multiset的数据结构是二叉树
set中不允许有重复元素,所以可以做去重操作
multiset中允许有重复元素

引入头文件

1
#include <set>

构造

空构造

1
2
3
set<T> s;

multiset<T> s;

拷贝构造

1
2
3
set<T> s(s);

multiset<T> s(s);

赋值

利用运算符重载赋值

1
s = s;

容量和大小的操作

判断容器是否为空

1
s.empty();

获取元素的个数

1
s.size();

在容器中插入数据(set)

  • 返回一个对组

<element>:元素

1
2
3
s.insert(<element>);

pair<set<T>::iterator, bool> p = s.insert(<element>);

在容器中插入数据(multiset)

  • 返回一个迭代器

<element>:元素

1
2
3
s.insert(<element>);

iterator it = s.insert(<element>);

删除迭代器位置的元素

  • 返回下一个元素的位置

<iterator>:迭代器

1
s.erase(<iterator>);

删除一组元素

  • 返回下一个元素的位置

<iterator_start>:开始位置迭代器
<iterator_end>:结束位置迭代器

1
s.erase(<iterator_start>, <iterator_end>);

删除容器中所有的元素

1
s.clear();

删除所有与指定元素相同的元素

<element>:元素

1
s.erase(<element>);

查找

  • 获取指定元素是否存在

  • 如果元素存在,返回该元素的迭代器

  • 如果元素不存在,返回s.end()

1
set<T>::iterator it = s.find(<element>);

统计

  • 统计元素的个数
  • 因为set不允许有重复元素,所以得到的结果只能是0或1。而multiset所得到的结果可能大于1
1
s.count(<element>);

交换

  • 容器内数据的互换
1
s.swap(s);

排序

  • 修改set容器的排序规则,实现降序排列

如果一个重载运算符的函数返回值类型为bool,权限是public,重载的运算符是小括号,那么这个函数被称为仿函数

内置类型

1
2
3
4
5
6
7
8
9
10
11
12
// 创建一个类,在类中重写小括号运算符,在重新方法中定义排序规则
class Compare
{
public:
bool operator()(T t1, T t2)
{
return t1 > t2;
}
};

// 在创建set容器时,指定自定义的排序规则
set<T, Compare> s;

自定义类型

1
2
3
4
5
6
7
8
9
10
11
12
// 创建一个类,在类中重写小括号运算符,在重新方法中定义排序规则
class Compare
{
public:
bool operator()(const T & t1, const T & t2)
{
return t1 > t2;
}
};

// 在创建set容器时,指定自定义的排序规则
set<T, Compare> s;

完成

参考文献

哔哩哔哩——黑马程序员