c++---set/multiset容器

1、set基本概念

简介:所以元素在插入时被自动排序

本质:set、multiset属于关联式容器,底层结构用的是二叉树实现

set和multiset区别:

  • set不允许容器中有重复的元素
  • multiset允许容器中有重复元素

2、set构造与赋值

函数原型:

  • set st;默认构造函数
  • set(const set &st);拷贝构造函数
  • set& operator=(const set &st);重载等号操作符
#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}
void test01()
{
	set s;
	s.insert(10);
	s.insert(500);
	s.insert(30);
	s.insert(40);
	s.insert(30);
	printset(s);//10 30 40 500

	set s2;
	s2 = s;
	printset(s2);//10 30 40 500

	set s3(s);
	printset(s3);//10 30 40 500

}

int main()
{
	test01();
	system("pause");
	return 0;
}

3、set大小和交换

函数原型:

  • size();返回容器中元素的数目
  • empty();判断容器是否为空
  • swap(st);交换两个集合容器
#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}
void test01()
{
	set s;
	s.insert(10);
	s.insert(500);
	s.insert(30);
	s.insert(40);
	s.insert(30);
	printset(s);//10 30 40 500

	set s2;
	s2.insert(1);
	s2.insert(56);
	s2.insert(32);
	s2.insert(41);
	s2.insert(100);
	printset(s2); //1 32 41 56 100

	if (s2.empty())//!kong
	{
		cout << "kong" << endl;
	}
	else
	{
		cout << "!kong" << endl;
	}

	cout << s.size() << endl;//4
	cout << s2.size() << endl;//5

	s.swap(s2);
	printset(s);//1 32 41 56 100
	printset(s2);//10 30 40 500
}

int main()
{
	test01();
	system("pause");
	return 0;
}

4、set插入与删除

函数原型:

  • insert(elem);向容器中插入元素
  • clear();清空容器
  • erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(beg,end);删除beg,end之间的所有元素,返回下一个元素迭代器
  • erase(elem);删除容器中值为elem的元素
#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}
void test01()
{
	set s;
	s.insert(10);
	s.insert(500);
	s.insert(30);
	s.insert(40);
	s.insert(70);
	s.insert(45);
	s.insert(63);
	s.insert(87);
	s.insert(81);
	printset(s);//10 30 40 45 63 70 81 87 500

	s.erase(s.begin());
	printset(s); //30 40 45 63 70 81 87 500
	
	s.erase(40);
	printset(s); //30 45 63 70 81 87 500



	
}

int main()
{
	test01();
	system("pause");
	return 0;
}

5、set查找和统计

函数原型:

  • find(key);查找key是否存在,存在,返回该元素的迭代器,不存在,返回set.end();
  • count(key);统计key元素的个数
#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}
void test01()
{
	set s;
	s.insert(10);
	s.insert(500);
	s.insert(30);
	s.insert(40);
	s.insert(70);
	s.insert(45);
	s.insert(63);
	s.insert(87);
	s.insert(81);
	printset(s);//10 30 40 45 63 70 81 87 500

	set::iterator pos = s.find(400);
	if (pos != s.end())//没找到
	{
		cout << *pos << endl;
	}
	else
	{
		cout << "没找到" << endl;
	}
	int num = s.count(80);
	cout << num << endl;// 0
}

int main()
{
	test01();
	system("pause");
	return 0;
}

6、set和multiset区别

区别:

  • set不可以插入重复数据,multiset可以
  • set插入数据同时会返回插入结果,表示插入是否成功
#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}

void printmultiset(multiset &st)
{
	for (multiset::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}
void test01()
{
	set s;
	s.insert(10);
	pair::iterator, bool> ret = s.insert(20);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}

	ret = s.insert(20);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}
	printset(s);//10 30 40 45 63 70 81 87 500

	multiset ms;
	ms.insert(10);
	ms.insert(20);
	ms.insert(10);
	printmultiset(ms);
}

int main()
{
	test01();
	system("pause");
	return 0;
}
插入成功
插入失败
10 20
10 10 20
请按任意键继续. . .

7、pair对组创建

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

函数原型:

  • pair p(value1,value2);
  • pair p = make_pair(value1,value2);
void test02()
{
	pair p("Tom", 20);
	cout << p.first << " " << p.second<< endl;

	pair p1 = make_pair("jerry", 10);
	cout << p1.first << " " << p1.second << endl;
}

int main()
{
	//test01();
	test02();
	system("pause");
	return 0;
}

8、set容器排序

目标:set容器默认从小到大排序,如何改变排序规则

方法:利用仿函数,可以改变排序规则

#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << *sit << " ";
	}
	cout << endl;
}

class mycompare
{
public:
	bool operator()(int v1, int v2)
	{
		return v1 > v2;
	}
};

void test01()
{
	set s;
	s.insert(10);
	s.insert(20);
	s.insert(5);
	s.insert(56);
	s.insert(23);
	s.insert(28);
	s.insert(67);
	s.insert(51);
	printset(s);//5 10 20 23 28 51 56 67

	set s1;
	s1.insert(10);
	s1.insert(20);
	s1.insert(5);
	s1.insert(56);
	s1.insert(23);
	s1.insert(28);
	s1.insert(67);
	s1.insert(51);
	
	for (set::iterator sit = s1.begin(); sit != s1.end(); sit++)
	{
		cout << *sit << " ";//67 56 51 28 23 20 10 5
	}
	cout << endl;
}



int main()
{
	test01();
	
	system("pause");
	return 0;
}

案例1

#include 
#include 
#include 
#include 
#include 
#include
#include//标准算法头文件
#include
#include
#include
#include
using namespace std;

class person
{
public:
	person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	string m_name;
	int m_age;

};
void printset(set &st)
{
	for (set::iterator sit = st.begin(); sit != st.end(); sit++)
	{
		cout << (*sit).m_name << " " << (*sit).m_age << " " ;
	}
	cout << endl;
}

class mycompare
{
public:
	bool operator()(const person p1, person p2)
	{
		return p1.m_age > p2.m_age;
	}
};

void test01()
{
	//自定义数据类型要指定排序规则
	set s;
	person p1("张飞", 20);
	person p2("关羽", 28);
	person p3("刘备", 45);
	person p4("曹操", 30);
	person p5("赵云", 18);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	s.insert(p5);
	
	for (set::iterator sit = s.begin(); sit != s.end(); sit++)
	{
		cout << sit->m_name << " " << sit->m_age << " ";
	}
	cout << endl;
}



int main()
{
	test01();
	
	system("pause");
	return 0;
}

你可能感兴趣的:(c++学习笔记,c++)