目录
set是一种关联式容器,特性如下:
- set以RBTree作为底层容器
- 不允许出现键值重复
- set容器只提供 insert()方法,因为它自动进行排序
- 不能通过迭代器来改变set的值,
可以通过set是迭代器改变元素的值吗??
不可以改变,如果非要改变,删除后再添加。
如果set中允许修改键值的话,那么首先需要删除该键,然后调节平衡,在插入修改后的键值,再调节平衡,这样严重破坏了set的结构,导致iterator失效,不知道应该指向之前的位置,还是指向改变后的位置。STL中将set的迭代器设置成const,不允许修改迭代器的值。
set 构造、赋值、插入、删除
- set构造函数
set<T>st; //set默认构造函数
set(const set &st);//拷贝构造函数
- set赋值操作
set& operator=(const set &st);// 等号运算符的重载
swap(st);// 交换两个容器
- set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
- ser插入和删除操作
insert(elem);//在容器中插入元素
clear();//清除所有元素
erase(pos);//删除迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间所有元素,返回下一个元素的迭代器
erase(elem);/删除容器中值为 elem的元素
操作代码:
#include <algorithm>
#include <iostream>
#include<set>
using namespace std;
void Print(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
}
void test01()
{
//set容器初始化
set<int> s1; //自动进行排序,默认从小到大
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
Print(s1);//1 2 4 5 7
set<int> s2;
s2 = s1;//赋值
//删除元素
s1.erase(s1.begin());//erase()参数为 迭代器
Print(s1); //2 4 5 7
s1.erase(7);
Print(s1);// 2 4 5
}
int main()
{
test01();
return 0;
}
打印结果:
set 查找操作
- find(key):查找键key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
- lower_bound(keyElem):返回第一个key>=keyElem元素的迭代器。
- upper_bound(keyElem):返回第一个key>keyElem元素的迭代器。
- equal_range(keyElem):返回容器中ley与keyElemx相等的上下限的两个迭代器,即equal_range()将lower_bound()和upper_bound()的 返回值做个一个pair返回。
操作代码:
#include <algorithm>
#include <iostream>
#include<set>
using namespace std;
//set的查找
void test02()
{
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
set<int>::iterator ret=s1.find(14);
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
ret=s1.lower_bound(2);//找到第一个>=
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
ret = s1.upper_bound(2);//找到第一个>
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
//equal_range返回lower_bound和upper_bound
pair<set<int>::const_iterator, set<int>::const_iterator> myret=s1.equal_range(2);
if (myret.first == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.first) << endl;
}
if (myret.second == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.second) << endl;
}
}
int main()
{
//test01();
test02();
return 0;
}
打印结果: