/*
3.7.2 set常用API
3.7.2.1 set构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set& st);//拷贝构造函数
3.7.2.2 set赋值操作
set & operator=(const set & st);//重载等号操作符
swap(st);//交换两个集合容器
3.7.2.3 set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空3.7.2.4 set插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。
*/
#include <iostream>
#include <string>
#include <set>
using namespace std;void printSetInt(set<int> &s) {for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {cout << (*it) << endl;}
}
void test1() {//set 是关联式容器, 关联式容器在插入的时候自动排好序// 序列式容器, 怎么插入的就怎么排序set<int> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);printSetInt(s1);if (s1.empty()) {cout << "s1 is empty" << endl;}else {cout << "s1 size of " << s1.size() << endl;}s1.erase(s1.begin());s1.erase(3);printSetInt(s1);
}
/*
3.7.2.5 set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
*/
void test2() {set<int> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);set<int>::iterator pos = s1.find(3);if (pos!=s1.end()) {cout << "找到了 值为" << (*pos) << endl;}else {cout << "未找到" << endl;}int num = s1.count(1); cout << "1 的个数为" << num << endl;set<int>::iterator lb = s1.lower_bound(3);if (lb != s1.end()) {cout << "lower_bound(3) 为" << *lb << endl;} else {cout << "未找到" << endl;}set<int>::iterator ub = s1.upper_bound(3);if (ub != s1.end()) {cout << "upper_bound(3) 为" << *ub << endl;}else {cout << "未找到" << endl;}pair<set<int>::iterator, set<int>::iterator> er = s1.equal_range(3);if (er.first != s1.end()) {cout << "找到 s1.equal_range(3)的lower_bound为" << *(er.first) << endl;} else {cout << "未找到" << endl;}if (er.second != s1.end()) {cout << "找到 s1.equal_range(3)的upper_bound为" << *(er.second) << endl;}else {cout << "未找到" << endl;}
}// 创建pair的方式 对组
void test3() {//第一种pair<string, int> p(string("Tom"), 10);// 取值cout << "name is " << p.first << endl;cout << "age is " << p.second << endl;//第二种pair<string, int> p2 = make_pair("Jerry", 15);// 取值cout << "name is " << p2.first << endl;cout << "age is " << p2.second << endl;
}void test4() {// set容器不允许插入重复的值set<int> s1;pair<set<int>::iterator, bool> ret = s1.insert(10);if (ret.second) {cout << "10 插入成功" << endl;} else {cout << "10 插入失败" << endl;}pair<set<int>::iterator, bool> ret2 = s1.insert(10);if (ret2.second) {cout << "10 插入成功" << endl;}else {cout << "10 插入失败" << endl;}
}//仿函数
class MySort {
public:bool operator()(int v1, int v2) const {return v1 > v2;}
};void printSetIntSort(set<int, MySort> &s) {for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {cout << (*it) << endl;}
}
// set容器排序
void test5() {// <> 里面,第二个参数可以指定排序规则,但是因为<>需要类型,所以这里需要用到仿函数set<int, MySort> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);printSetIntSort(s1);
}//set 插入自定义数据类型
class Person {
public:Person(string name, int age) {this->m_name = name;this->m_age = age;}string m_name;int m_age;/*bool operator== (Person& p1) {if (this->m_age==p1.m_age && this->m_name == p1.m_name) {return true;}return false;}*/
};//自定义数据类型指定排序规则时所有成员都得是const成员
class compare01
{
public:bool operator()(const Person& p1, const Person& p2)const{return p1.m_age > p2.m_age;}
};void test6() {set<Person, compare01> s1; Person p1("大娃", 25);Person p2("二娃", 20);Person p3("五娃", 15);Person p4("三娃", 22);Person p5("爷爷", 55); // 这里如果爷爷的年龄和大娃一样,就无法插入到s1,当中, 应该用的是年龄做判断s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);s1.insert(p5);for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}cout << "-----" << endl;//s1.erase(p5);for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}Person p6("三娃", 22);cout << "-----" << endl;s1.erase(p6); // Person类就算没有重载 == 运算符,也能把三娃删除掉// set容器删除元素,判断是否相等, 是通过compare01来判断的for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}
}
int main()
{//test1();//test2();//test3();//test4(); //test5();test6();return 0;
}