- 特点
- 本质
- set/multiset属于关联式容器,底层结构是二叉树实现
- set和multiset区别
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
- set不允许容器中有复杂的元素
- multiset允许容器中有复杂的元素
- 构造和赋值
- 构造
- set < T >st
- set(const set &st)
- 赋值
- set& operator=(const set &st)
- 大小和交换
- 插入和删除
- 原型
- insert(elem)
- clear()
- erase(pos)
- erase(beg, end)
- erase(elem)—删除容器中值为elem的元素
- 查找和统计
- 对set容器中进行查找数据及统计数据
- 原型
- find(key)—查找key是否存在,返回该键的元素的迭代器,若不存在则返回set.end()
- count(key)—统计key的元素个数—只有0/1两种选择
- pair对组创建
- 功能
- 创建方式
- pair<type, type> p (value1, value2)
- pair<type, type> p = make_pair(value1, value2)
#include<iostream>#include<string>using namespace std;void test(void){pair<string, int> Person1("zhangsan", 18);cout << " name " << Person1.first << " age " << Person1.second << endl;pair<string, int> Person2 = make_pair("lisi", 28);cout << " name " << Person2.first << " age " << Person2.second << endl;}int main(){test();return 0;}
- set容器排序
- set容器默认排序规则为从小到大,如何改变规则
- 利用仿函数
- set容器存放内置数据类型如何改变规则
#include<iostream>#include<string>#include<set>using namespace std;class myCompare{public:bool operator()(int i1, int i2){return i1 > i2;}};void myPrint(const set<int>& st){for (set<int>::iterator it = st.begin(); it != st.end(); it++){cout << *it << endl;}}void test(void){set<int> st;st.insert(10);st.insert(30);st.insert(90);st.insert(40);myPrint(st);cout << "=================================" << endl;set<int, myCompare> sts ;sts.insert(10);sts.insert(30);sts.insert(90);sts.insert(40); for (set<int, myCompare>::iterator it = sts.begin(); it != sts.end(); it++){cout << *it << endl;}}int main(){test();return 0;}
- set容器存放自定义数据类型如何改变规则—必须要自定义排序规则
#include<iostream>#include<string>#include<set>using namespace std;class Person{public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}};class myCompare{public:bool operator()(const Person& i1, const Person& i2){return i1.m_age > i2.m_age;}};void test(void){set<Person, myCompare> Infor;Person p1("zhangsan", 18);Person p2("lisi", 28);Person p3("wangwu", 20);Infor.insert(p1);Infor.insert(p2);Infor.insert(p3);for(set<Person, myCompare>::iterator it = Infor.begin(); it != Infor.end(); it++){cout << "name " << it->m_name << " age " << it->m_age << endl;}}int main(){test();return 0;}