【STL】set/multiset容器
1、set基本概念
特点:所有元素都会在插入时自动被排序。
set/multiset属于关联式容器,底层结构使用二叉树实现。
set和multiset容器区别:set不允许容器中有重复的元素, 而multiset允许。
2、set构造和赋值
std::set<int>s; //默认构造s.insert(1);s.insert(4);s.insert(6);s.insert(2);s.insert(2);//printSet(s); // 1 2 4 6std::set<int>s1(s); //拷贝构造printSet(s1); // 1 2 4 6std::set<int>s2(s); //赋值构造s2 = s1;
3、set大小和交换
统计set容器大小以及交换set容器
std::set<int>s; //默认构造s.insert(1);s.insert(4);s.insert(6);s.insert(2);s.insert(2);if (!s.empty()) {cout << s.size() << endl;}set<char>s1;s1.insert('a');s1.insert('c');s1.insert('c');s1.insert('b'); printSet(s1); // a b cset<int>s2;s2.insert(100);s2.insert(400);s2.insert(300);s.swap(s2); // 仅限同类型集合交换printSet(s); // 100 300 400
4、set插入和删除
- insert(elem);
- clear();
- erase(pos); 删除指定位置元素
- erase(beg,end); 删除指定区间元素
- erase(elem); 删除指定元素
std::set<int>s; //默认构造s.insert(1);s.insert(4);s.insert(6);s.insert(2);s.insert(2);s.erase(7); //删除指定元素s.erase(2);s.erase(s.begin(),s.begin()++); //删除区间元素s.clear();printSet(s);
5、set查找和统计
- find(key); 查找key是否存在,若存在返回该元素的迭代器;不存在,返回set.end()
- count(key);返回元素个数,0或1;
std::set<int>s; //默认构造s.insert(1);s.insert(4);s.insert(6);s.insert(2);s.insert(2);set<int>::iterator it = s.find(2);if (it != s.end()) {cout << "存在";}else if (it == s.end()) {cout << "不存在";}printSet(s);cout << s.count(3) << endl; // 0cout << s.count(1); // 1
6、multiset
multiset<int>s1;s1.insert(1);s1.insert(2);s1.insert(2);s1.insert(6);s1.insert(5);printSet(s1); // 1 2 2 5 6
7、Pair对组
成对出现的数据,利用对组可以返回两个数据
- pair<type,type>p(value,value1);
- pair<type,type>p=make_pair(value1,value2);
pair<int,char>p(65, 'a');pair<string,char>p1("tom", 'm');cout << p1.first << " " << p1.second << " ";pair<int, int>p3 = make_pair(1, 2);cout << p3.first << p3.second << endl;
8、Set容器排序
set容器默认排序规则为从小到大
set容器实现内置数据类型和自定义数据类型的排序
class Person {
public:string name;int age;Person(string m_name,int m_age) {name = m_name;age = m_age;}
};
class Mycompare {
public:bool operator()(const Person & p1, const Person& p2) const{return p1.age > p2.age;}bool operator()(int a, int b) const{return a > b;}
};
void test02() {set<int, Mycompare>s2;s2.insert(34);s2.insert(32);s2.insert(35);s2.insert(346);s2.insert(3);for (set<int, Mycompare>::const_iterator it = s2.begin(); it != s2.end(); it++) {cout << *it << "\\n"; // 346 35 34 32 3}Person p1("曹操", 54);Person p2("曹丕", 34);Person p3("曹冲", 13);Person p4("曹植", 24);set<Person, Mycompare>s1;s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);for (set<Person, Mycompare>::const_iterator it = s1.begin(); it != s1.end(); it++) {cout << it->name << " " << it->age << "\\n";}
}