set/multiset容器
set容器基本概念
- set容器中的所有元素在插入后都会自动被排序
- set/multiset容器属于关联式容器,底层结构是用二叉树实现
(关联式容器是指通过键索引元素值,在set容器中元素值即为键。与关联式容器对应的是序列式容器,包括vector,list等等,这些容器是通过位置索引访问数据。)
set容器的构造和赋值
- 构造:
set<T> st//默认构造函数
set(const set& st)//拷贝构造函数
- 赋值:
set& operator=(const set& st)//重载等号运算符
set容器的大小和交换
int size();//返回容器中数据的个数
bool empty();//判断容器是否为空
void swap(const set& st);//交换两个容器的数据
set容器元素的插入和删除
pair<iterator, bool> insert(value);//插入指定元素vlaue
void clear();//清除容器内的所有元素
iterator erase(pos);//删除指定位置的元素,返回下一个元素的迭代器
iterator erase(beg, end);//清除该区间内的元素(左闭右开)
int erase(value);//清除值为value的元素,返回删除的元素的个数(在set容器中只能为0或1)
因为set容器会对元素自动排序,所以插入元素的函数只有 insert 函数
set容器查找和统计
itreator find(value);//查找值为value的元素,若存在则返回其迭代器,若不存在则返回set.end()
int count(vlaue);//统计容器中值为value的元素的个数,在set容器中只能为0或1
set和multiset容器的区别
- set容器不可以插入重复的数据 multiset容器可以
- set容器的insert函数除了返回插入的数据的迭代器还会返回是否插入成功,而multiset容器不会检测插入的数据(因此可以插入重复的元素) 它的insert函数的只会返回插入元素的迭代器
pair对组
利用队组可以返回成对的数据
set容器的insert函数的返回值即为pair类型(
pair<set<T>, bool>
),同时返回了插入元素的迭代器和是否插入成功,如果有重复元素未能成功插入则迭代器会返回容器中已有元素的迭代器。
对组的创建
//两种创建方式
pair<type, type> p (value1, value2);
pair<type, type> p = make_pair(value1, value2);
//通过p.first p.second即可访问value1和value2
set容器排序
通过仿函数,我们可以改变set容器的排序规则(set容器默认从小到大排序)
同样 也可以通过仿函数为自定义数据类型排序
仿函数的定义
简单来说,仿函数就是一个行为像函数的对象 这是因为它的本质是一个重载了()运算符的类或者结构体,所以可以像函数一样被调用(用 ‘对象名(参数)’的形式)
class myCompare
{
public:bool operator() (int v1, int v2){return v1 > v2;}
};void test01()
{set<int, myCompare> s;s.insert(10);s.insert(20);s.insert(30);s.insert(40);s.insert(50);for(set<int, myCompare>::iterator it = s.begin(); it != s.end(); s++){cout << *it << " " ;}
}int main()
{test01();return 0;
}
通过以上代码,set容器的排序方式变成了从大到小排序 如果需要给自定义的数据类型排序,也需要我们通过以上的方法。