C++ set容器

C++ set容器,第1张

set/multiset 容器 set基本概念

简介:

  • 所有元素都会在插入时自动排序

本质:

  • set/multiset属于关联式容器,地层结构是用二叉树实现

set和multiset区别:

  • set不允许容器中有重复的元素
  • multiset允许容器中有重复的元素
set构造和赋值

功能:
创建set容器以及赋值

构造:

  • set st; //默认构造函数
  • set(const set &st); //拷贝构造函数

赋值:

  • set& operator=(const set &st); // 重载赋值运算符

实例:

#include
#include 
using namespace std;

//set容器 构造和赋值
void PrintSet(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void _01Test01()
{
	set<int> st;

	//插入数据 只有insert方式
	st.insert(10);
	st.insert(20);
	st.insert(10);
	st.insert(40);
	st.insert(30);
	st.insert(30);

	//set容器特点:
	//1、按顺序插入元素
	//2、不能含有重复元素
	PrintSet(st);
}

void main()
{
	_01Test01();
}

set查找和统计

功能:

  • 对set容器进行查找数据和统计数据

函数原型:

  • find(elem); //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
  • count(elem); //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;

示例:

#include
using namespace std;
#include
//set容器 查找和统计
//- find(elem);    //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
//-count(elem);    //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;

//查找
void _04Test01()
{
	set<int> s;
	s.insert(10);
	s.insert(20);
	s.insert(30);
	s.insert(40);

	set<int>::iterator it= s.find(40);
	if (it == s.end())
	{
		cout << "未找到该元素" << endl;
	}
	else
	{
		cout << "找到了该元素" << endl;
	}
}

//统计
void _04Test02()
{
	set<int> s;
	s.insert(10);
	s.insert(20);
	s.insert(30);
	s.insert(40);
	s.insert(30);
	s.insert(30);
	s.insert(30);

	int num=s.count(30);
	//对于set而言,由于set容器不能包含重复元素 所以count只能返回1或0
	cout << " num=" << num << endl;
}



void main()
{
	//_04Test01();
	_04Test02();
}
set和multiset区别

区别:

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据
#include
using namespace std;
#include
// set和multiset的区别

void _05Test01()
{
	set<int>s;
	pair<set<int>::iterator, bool> ret;

	//第一次插入10的时候可以成功插入
	ret= s.insert(10);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}

	//第二次插入1-的时候,插入失败
	ret = s.insert(10);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}
}

void _05Test02()
{
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);
	ms.insert(10);
	ms.insert(10);

	for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void main()
{
	//_05Test01();
	_05Test02();
}
set容器排序

set容器默认排序规则是由小到大,掌握如何改变排序规则

只要技术点:

  • 利用仿函数,可以改变排序规则

仿函数:

  • 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类。
      因此,这里需要明确两点:
      1 仿函数不是函数,它是个类;
      2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用函数)。

示例:

#include
using namespace std;
#include

//set容器  排序
class MySort
{
public:
	//重载()
	bool operator()(int num1, int num2)const
	{
		//按照降序排列
		return num1 > num2;
	}

};

void _07Test01()
{
	//在插入数据前先指定排序规则(利用仿函数)
	set<int,MySort> mySet;
	mySet.insert(10);
	mySet.insert(30);
	mySet.insert(20);
	mySet.insert(50);
	mySet.insert(40);

	for(set<int,MySort>::iterator it=mySet.begin();it!=mySet.end();it++)
	{
		cout << *it << " ";
	}

	cout << endl;
}

void main()
{
	_07Test01();
}
set容器存放自定义数据类型-排序

技术要点:

  • 利用仿函数改变排序规则

示例:

#include
#include
using namespace std;

//set容器 存放自定义数据类型 并自定义排序规则

class Person
{

public:
	string m_Name;
	int m_Age;

public:
	Person(string name,int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
};

class MyCompare
{
public:
	bool operator()(const Person &p1,const Person &p2)const
	{
		if (p1.m_Age == p2.m_Age)
		{
			return p1.m_Name < p2.m_Name;
		}
		else
		{
			return p1.m_Age < p2.m_Age;
		}	
	}
};

void _08Test01()
{
	Person p1("刘备", 24);
	Person p2("张飞", 35);
	Person p3("关羽", 28);
	Person p4("诸葛亮", 23);
	Person p5("赵云", 28);
	Person p6("吕布", 28);
	Person p7("貂蝉", 28);

	set<Person, MyCompare> s;
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	s.insert(p5);
	s.insert(p6);
	s.insert(p7);

	for (set<Person, MyCompare>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名:" << it->m_Name << "\t年龄:" << it->m_Age << endl;
	}
}

void main()
{
	_08Test01();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498309.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存