set容器
set容器的特性,所有元素的都会根据元素的键值自动被排序,set的元素不像map那样可以同时拥有实值和键值,set元素及是键值也是实值,所以我们不能通过迭代器改变set元素值,会破坏set结构
multiset容器
他和set容器基本一样,唯一的区别就是multiset容器可以重复,他们的底层实现都是红黑树
常用函数接口
set构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数
set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
size();//返回容器中元素的数目
empty();//判断容器是否为空
set插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。
set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
其中解释一下这个find操作和这个equal_range操作
void test1 ()
{
set<int>s;
s.insert(10);
s.insert(20);
s.insert(40);
set<int>::iterator it = s.begin();
it = s.find(100); //失败返回的就是end的位置
if (it == s.end())
{
cout << "未找到" << endl;
}
else
cout << "find" << endl;
cout << s.size() << endl;
pri(s);
}
在双边寻找的时候,我们需要一个新的定义,就是pair“对组”,他的定义就是pair<iterator, iterator>,拥有两个迭代器类型,我们对他进行访问就好
pair<set<int>::iterator, set<int>::iterator >ret=s.equal_range(40);
cout << *ret.first << " " << *ret.second << endl;
multiset
他的和set的区别就是它允许出现相同的数据,
terator insert(value_type&& _Val) 这个是multiset的返回值,他的只是返回一个迭代器】pair<iterator, bool> insert(value_type&& _Val) 这个是set插入的返回值,而他多返回一个bool类型代表是否失败
set类型的逆序排列
我们要改变他的排列顺序就需要在容器定义的时候,使用set的仿函数,定义他的构造类型
class cmp
{
public:
bool operator()(int v1,int v2)const
{
return v1 > v2;
}
};
void text2()
{
set<int, cmp>s;
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(30);
for (set<int, cmp>::iterator it = s.begin(); it != s.end(); it++)
cout << *it << endl;
}