> 文章列表 > 【STL】set/multiset容器

【STL】set/multiset容器

【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";}
}