1.所有元素在插入时就会被自动排序。
2.底层是二叉树的实现。
3.set中不允许有重复的元素,multiset里面允许有重复的元素。
一、构造函数
set<T> st; set(const set &st);
二、赋值
set& operator(const set &st);
三、大小和交换
size();
empty();
swap();
四、插入和删除
insert(ele);
clear();
erase(pos);
erase(beg,end);
erase(ele);
五、查找和统计
find(key);//查找key是否存在,若存在,则返回该键元素的迭代器,若不存在,则返回set.end(); count(key);//统计key的个数
六、对set进行排序
set默认排序是从小到大,可以利用仿函数,改变排序规则。
1.对内置数据类型进行排序
#include<iostream> using namespace std; #include <set> //set容器排序 class MyCompare { public: const bool operator()(int v1,int v2) const { return v1 > v2; } }; void test01() { set<int>s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(50); s1.insert(30); for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) { cout << *it << " "; } cout << endl; //指定排序规则为从大到小 set<int, MyCompare>s2; s2.insert(10); s2.insert(40); s2.insert(20); s2.insert(50); s2.insert(30); for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test01(); system("pause"); return 0; }
输出:
需要注意的是vs2019重载operator()需要加const,不然会报错。
2.对自己定义的数据类型进行排序
#include<iostream> using namespace std; #include <string> #include <set> //set容器排序,存放自定义数据类型 class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; class comparePerson { public: bool operator()(const Person& p1, const Person& p2) const { //按照年龄 降序 return p1.m_Age > p2.m_Age; } }; void test01() { //自定义数据类型 都会指定排序规则 set<Person, comparePerson>s; //创建Person对象 Person p1("刘备", 24); Person p2("关羽", 28); Person p3("张飞", 25); Person p4("赵云", 21); s.insert(p1); s.insert(p2); s.insert(p3); s.insert(p4); for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++) { cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl; } } int main() { test01(); system("pause"); return 0; }
输出: