栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

set/multiset容器(二叉树)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

set/multiset容器(二叉树)

所有的元素都会在插入时自动被排序。
set容器与multiset容器本质在底层结构是二叉树,头文件均为#include

set容器与multiset容器有什么区别?
set容器不允许容器中有重复的元素。
multiset容器允许容器有重复的元素。

#include 
using namespace std;
#include     //set/multiset

void printSet(set &s)
{
    //遍历输出
	for(set::iterator it = s.begin();it!=s.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main(int argc,char *argv[])
{
	set s;  //默认构造
	s.insert(20);
	s.insert(50);    //在容器中插入元素
	s.insert(10);
	s.insert(40);
	s.insert(30);

	printSet(s);

	set s2(s);    //拷贝构造函数
	printSet(s2);

	set s3;
	s3 = s2;           //重载等号操作符
	printSet(s3);

	if( s3.empty() )    //判断容器是否为空
	{
		cout << "s3为空" << endl;
	}
	else{
		cout << "s3不为空" << endl;
		cout << "s3.size() = " << s3.size() << endl; //返回容器中元素的数目
	}

	set s4;
	s4.insert(100);    //在容器中插入元素
	s4.insert(300);
	s4.insert(400);
	s4.insert(200);
	s4.insert(500);

	cout << "交换前:" << endl;
	printSet(s3);
	printSet(s4);

	s3.swap(s4);    //交换两个集合容器

	cout << "交换后:" << endl;
	printSet(s3);
	printSet(s4);

	//s4.clear();    //清除所有元素
	//printSet(s4);
	
	//s4.erase(s4.begin(),s4.end()); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
	//printSet(s4);
	
	set::iterator it = s4.begin();
	it++;
	s4.erase(it,s4.end());
	printSet(s4);

	set::iterator sit = s3.find(200); 
    //查找是否存在,若存在,返回该元素的迭代器,若不存在,返回
	if(sit != s3.end())
	{
		cout << *sit << endl;
	}
	else{
		cout << "未找到!" << endl;
	}

	int num = s3.count(200); //统计元素的个数 0或1 (set容器不允许容器中有重复的元素)
	cout << "num = " << num << endl;

	return 0;
}
  1. set构造和赋值

构造

set st;  //默认构造函数

set(const set &set);  //拷贝构造函数

赋值:

set& operator=(const set &set);  //重载等号操作符

大小与交换

size();   //返回容器中元素的数目。

empty();  //判断容器是否为空。

swap();   //交换两个集合容器。

插入与删除

insert(elem);  //在容器中插入元素

clear();       //清楚所有元素

erase(pos);    //删除pos迭代器所指的元素,返回下一个元素的迭代器。

erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器。

erase(elem);   //删除容器中值为elem的元素。

查找与统计

find(key);  //查找key是否存在,若存在,返回该键的元素的迭代器,若果不存在,返回set.end();

count(key);  //统计key元素的个数。

set容器的排序   ---   set容器存放内置数据类型。
set容器默认排序规则从小到大,掌握如何改变排序规则。

主要技术点:
利用仿函数,可以修改排序规则

由于()运算符重载后使用方式非常像函数的调用,因此称为仿函数。

#include 
using namespace std;
#include     

//set容器的降序
class MyCompare{
public:
	bool operator()(int v1,int v2)
	{
		//降序:让第一个数字大于第二个数字
		return v1 > v2;
	}
};

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

int main(int argc,char *argv[])
{
	//set s1;    //默认排序的规则是升序
	//s1.insert(40);
	//s1.insert(20);
	//s1.insert(10);
	//s1.insert(50);
	//s1.insert(30);

	//printSet(s1);  

	set s2;

	//插入之后,已经默认的排序规则从小到大,所以必须要在插入数据之前,就要告诉它排序的规则是什么
	s2.insert(40);
	s2.insert(30);
	s2.insert(20);
	s2.insert(50);
	s2.insert(10);

	printSet(s2);

	return 0;
}

set容器的排序  ---  存放自定义数据类型

#include 
using namespace std;
#include 

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

	string m_Name;  //姓名
	int m_Age;      //年龄
};

class MyCompare{
public:
	bool operator()(const Person &p1,const Person &p2)
	{
		//按照年龄降序
		return p1.m_Age > p2.m_Age;
	}
};

void printSet(set &s)
{
            //迭代器
	for(set::iterator it = s.begin();it!=s.end();it++)
	{
		cout << "姓名:" << (*it).m_Name << "年龄:" << it->m_Age << endl;
	}
}

int main(int argc,char *argv[])
{
	set s;

	Person p1("张三",30);
	Person p2("关羽",20);
	Person p3("孙悟空",10);
	Person p4("ggy",40);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

	printSet(s);
	return 0;
}

对于自定义数据类型,如果不指定规则,是无法插入数据

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779580.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号