【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 6
	std::set<int>s1(s); //拷贝构造
	printSet(s1);  // 1 2 4 6
	std::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 c
	set<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;  // 0
	cout << 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对组

成对出现的数据,利用对组可以返回两个数据

  • pairp(value,value1);
  • pairp=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";
	}
}

你可能感兴趣的:(c++,c++,java,数据库)