所有的元素都会在插入时自动被排序。
set容器与multiset容器本质在底层结构是二叉树,头文件均为#include
set容器与multiset容器有什么区别?
set容器不允许容器中有重复的元素。
multiset容器允许容器有重复的元素。
#includeusing namespace std; #include //set/multiset void printSet(set &s) { //遍历输出 for(set ::iterator it = s.begin();it!=s.end();it++) { cout << *it << " "; } cout << endl; } int main(int argc,char *argv[]) { set s; //默认构造 s.insert(20); s.insert(50); //在容器中插入元素 s.insert(10); s.insert(40); s.insert(30); printSet(s); set s2(s); //拷贝构造函数 printSet(s2); set s3; s3 = s2; //重载等号操作符 printSet(s3); if( s3.empty() ) //判断容器是否为空 { cout << "s3为空" << endl; } else{ cout << "s3不为空" << endl; cout << "s3.size() = " << s3.size() << endl; //返回容器中元素的数目 } set s4; s4.insert(100); //在容器中插入元素 s4.insert(300); s4.insert(400); s4.insert(200); s4.insert(500); cout << "交换前:" << endl; printSet(s3); printSet(s4); s3.swap(s4); //交换两个集合容器 cout << "交换后:" << endl; printSet(s3); printSet(s4); //s4.clear(); //清除所有元素 //printSet(s4); //s4.erase(s4.begin(),s4.end()); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器 //printSet(s4); set ::iterator it = s4.begin(); it++; s4.erase(it,s4.end()); printSet(s4); set ::iterator sit = s3.find(200); //查找是否存在,若存在,返回该元素的迭代器,若不存在,返回 if(sit != s3.end()) { cout << *sit << endl; } else{ cout << "未找到!" << endl; } int num = s3.count(200); //统计元素的个数 0或1 (set容器不允许容器中有重复的元素) cout << "num = " << num << endl; return 0; }
- set构造和赋值
构造
set
set(const set &set); //拷贝构造函数
赋值:
set& operator=(const set &set); //重载等号操作符
大小与交换
size(); //返回容器中元素的数目。
empty(); //判断容器是否为空。
swap(); //交换两个集合容器。
插入与删除
insert(elem); //在容器中插入元素
clear(); //清楚所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
查找与统计
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器,若果不存在,返回set.end();
count(key); //统计key元素的个数。
set容器的排序 --- set容器存放内置数据类型。
set容器默认排序规则从小到大,掌握如何改变排序规则。
主要技术点:
利用仿函数,可以修改排序规则
由于()运算符重载后使用方式非常像函数的调用,因此称为仿函数。
#includeusing namespace std; #include //set容器的降序 class MyCompare{ public: bool operator()(int v1,int v2) { //降序:让第一个数字大于第二个数字 return v1 > v2; } }; void printSet(set &s) { for(set ::iterator sit = s.begin();sit!=s.end();sit++) { cout << *sit << " "; } cout << endl; } int main(int argc,char *argv[]) { //set s1; //默认排序的规则是升序 //s1.insert(40); //s1.insert(20); //s1.insert(10); //s1.insert(50); //s1.insert(30); //printSet(s1); set s2; //插入之后,已经默认的排序规则从小到大,所以必须要在插入数据之前,就要告诉它排序的规则是什么 s2.insert(40); s2.insert(30); s2.insert(20); s2.insert(50); s2.insert(10); printSet(s2); return 0; }
set容器的排序 --- 存放自定义数据类型
#includeusing namespace std; #include class Person{ public: Person(string name,int age) { this->m_Name = name; this->m_Age = age; } string m_Name; //姓名 int m_Age; //年龄 }; class MyCompare{ public: bool operator()(const Person &p1,const Person &p2) { //按照年龄降序 return p1.m_Age > p2.m_Age; } }; void printSet(set &s) { //迭代器 for(set ::iterator it = s.begin();it!=s.end();it++) { cout << "姓名:" << (*it).m_Name << "年龄:" << it->m_Age << endl; } } int main(int argc,char *argv[]) { set s; Person p1("张三",30); Person p2("关羽",20); Person p3("孙悟空",10); Person p4("ggy",40); s.insert(p1); s.insert(p2); s.insert(p3); s.insert(p4); printSet(s); return 0; }
对于自定义数据类型,如果不指定规则,是无法插入数据



