一、set容器
Set 的特性是。
所有元素都会根据元素的键值自动被排序。
Set 的元素不像 map 那 样可以同时拥有实值和键值,set 的元素即是键值又是实值。
Set 不允许两个元素 有相同的键值。
我们可以通过 set 的迭代器改变 set 元素的值吗?不行,因为 set 元素值就是其键值,关系到 set 元素的排序规则。
如果任意改变 set 元素值,会严 重破坏 set 组织。
换句话说,set 的 iterator 是一种 const_iterator. set 拥有和 list 某些相同的性质,当对容器中的元素进行插入 *** 作或者删除 *** 作的时候, *** 作之前 所有的迭代器,在 *** 作完成之后依然有效,被删除的那个元素的迭代器必然是一个 例外。
所有元素都会根据元素的键值自动被排序。
set的元素即是键值又是实值。
set容器的键值不允许相同。
set容器提供的是只读迭代器(不允许用户修改元素的内容)
二、set容器的插入删除
void test01()
{
/*
set构造函数
set st;//set默认构造函数:
mulitset mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数
set赋值 *** 作
set& operator=(const set &st);//重载等号 *** 作符
swap(st);//交换两个集合容器
set大小 *** 作
size();//返回容器中元素的数目
empty();//判断容器是否为空
set插入和删除 *** 作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素
*/
set s;
//set容器自动根据键值排序
s.insert(30);
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(40);
for_each(s.begin(), s.end(), [](int val) {
cout << val << " ";
});//10 20 30 40 50
//set容器提供的是只读迭代器const_iterator
//用户不可以修改set容器的元素
set::const_iterator it = s.begin();
cout << "size = " << s.size() << endl;
//删除起始位置的元素
s.erase(s.begin());
for_each(s.begin(), s.end(), [](int val) {
cout << val << " ";
});//20 30 50
cout << endl;
}
二、set容器的查找
void test02()
{
/*
set查找 *** 作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;
若不存在,返回set.end();
count(key);//查找键key的元素个数
*/
set s;
//set容器自动根据键值排序
s.insert(30);
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(40);
//find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;
//若不存在,返回set.end();
set::const_iterator ret;
ret = s.find(20);
if (ret == s.end())
{
cout << "没有找到" << endl;
}
else
{
cout << "找到" << *ret << endl;
}
//count(key);//查找键key的元素个数
//set容器的键值 是不重复的 那么count(key)只能是1或0
cout << s.count(20) << endl;//1
cout << s.count(200) << endl;//0
}
三、set容器的lower_bound和upper_bound
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
void test03()
{
/*
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
*/
set s;
//set容器自动根据键值排序
s.insert(30);
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(40);
//下限:lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
set::const_iterator lower_ret;
lower_ret = s.lower_bound(30);
if (lower_ret == s.end())
{
cout << "没有找到30的下限" << endl;
}
else
{
cout << "找到30的下限:" << *lower_ret << endl;
}
//upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
set::const_iterator up_ret;
up_ret = s.upper_bound(30);
if (up_ret == s.end())
{
cout << "没有找到30的上限" << endl;
}
else
{
cout << "找到30的上限:" << *up_ret << endl;
}
//equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
//equal_range 返回的是对组
//first 对组中第一个值 second对组中第二个值
pair::const_iterator, set::const_iterator> pair_ret;
pair_ret = s.equal_range(30);
//下限lower_bound
if (pair_ret.first == s.end())
{
cout << "下限未找到" << endl;
}
else
{
cout << "下限找到:" << *(pair_ret.first) << endl;
}
//上限upper_bound
if (pair_ret.second == s.end())
{
cout << "上限未找到" << endl;
}
else
{
cout << "上限找到:" << *(pair_ret.second) << endl;
}
}
四、更改set容器的默认排序规则(推荐使用仿函数)
class MyGreater
{
public:
bool operator()(int val1, int val2)
{
return val1 > val2;
}
};
void test04()
{
//默认从小‐‐>大排
//改成从大‐‐>小排
//set s;
set s;
s.insert(30);
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(40);
for_each(s.begin(), s.end(), [](int val) {cout << val << " "; });
cout << endl;
}
五、set容器存放自定义数据的时候 重载<运算符
class Person
{
public:
string name;
int age;
Person(string name, int age)
{
this-> name = name;
this-> age = age;
}
//方法一:重载<运算符 小‐‐>大
bool operator<(const Person &ob)const
{
return this-> age < ob.age;
}
};
void test05()
{
set s;
s.insert(Person("火神", 19));
s.insert(Person("野合", 18));
s.insert(Person("燃料喷射器", 21));
s.insert(Person("红线", 29));
for_each(s.begin(), s.end(), [](Person val) {
cout << "name=" <
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)