set容器及multiset容器

导航

1.set容器及multiset容器基础知识
2.set交换与大小
3.set容器插入与删除
4.set容器查找与统计
5.set与multiset容器的区别
6.pair对组的创建方式
7.set容器排序(改变排序规则)
———————————————————————————————————
1.set容器及multiset容器基础知识
set与multiset都是关联式容器,所有被插入时都会自动排序

set与multiset容器区别

1.set不能再容器中有重复的数
2.multiset允许容器中有重复的元素

构造函数:

set< T > st
set(const set& st)

赋值:

operator= //赋值

set例子:

#include 
using namespace std;
#include 

void PrintSet(const set<int>&st)
{
     
	for(set<int>::const_iterator it = st.begin();it!=st.end();it++)
	{
     
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

void test()
{
     
	set<int> st;   
	st.insert(20); //插入数据用insert
	st.insert(10);
	st.insert(30);
	st.insert(40);
	st.insert(30);
	PrintSet(st);

	set<int> st1(st); //拷贝构造
	PrintSet(st1);

	set<int> st2;
	st2 = st1;
	PrintSet(st2);
}

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

运行结果:
在这里插入图片描述
———————————————————————————————————
2.set交换与大小

size() //容量
empty(); //若是容器空为1,不空为0
swap() //交换容器

———————————————————————————————————
3.set容器插入与删除

insert() //插入
clear() //清除
erase(pos) //清除pos迭代器所指元素,返回下一个元素
erase(beg,end) //迭代器指向的区间
erase(elem) //删除容器中为elem的元素

例子:

#include 
using namespace std;
#include 

void PrintSet(const set<int>&st)
{
     
	for(set<int>::const_iterator it = st.begin();it!=st.end();it++)
	{
     
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

void test()
{
     
	set<int> st;   
	st.insert(20); //插入数据
	st.insert(10);
	st.insert(30);
	st.insert(40);
	st.insert(30);
	PrintSet(st); //遍历

	//删除第一个数据
	st.erase(st.begin());
	PrintSet(st);   

	//删除重载  直接放入值
	st.erase(30);

	//清空
	//st.erase(st.begin(),st.end());
	st.clear();
	PrintSet(st);
}

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

运行结果:
在这里插入图片描述
———————————————————————————————————
4.set容器查找与统计

find(key) //找到返回对应元素的迭代器,没有找到返回.end()
cout(key) //set容器中没有重复的数,所以返回0或1

例子:

#include 
using namespace std;
#include 

void test()
{
     
	set<int> st;   
	st.insert(20); //插入数据
	st.insert(10);
	st.insert(30);
	st.insert(30);
	
	set<int>::iterator it = st.find(30); //find返回该位置的迭代器,没找到返回st.end()
	if(it != st.end())     //判断是否相同
	{
     
		cout<<"找到对应的"<<(*it)<<endl;
	}
	else
	{
     
		cout<<"没找到"<<endl;
	}

	cout<<"30的数量为:"<<st.count(30)<<endl; //因为set中没有重复数,返回只有1或着0

}

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

运行程序:
在这里插入图片描述
———————————————————————————————————
5.set与multiset容器的区别

set插入数据时会返回插入的结果,结果表示插入是否成功
multiset不会检测数据,因此可以插入重复的数据

检验:

#include 
using namespace std;
#include 

void test()
{
     
	set<int> st;   
	pair<set<int>::iterator,bool> ret = st.insert(20); //插入数据
	if(ret.second)
	{
     
		cout<<"第一次插入成功"<<endl;
	}
	else
	{
     
		cout<<"插入失败"<<endl;
	}

	ret = st.insert(20);
	if(ret.second) 
	{
     
		cout<<"第二次插入成功"<<endl;
	}
	else
	{
     
		cout<<"插入失败"<<endl;
	}

}

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

运行结果:
在这里插入图片描述
———————————————————————————————————
6.pair对组的创建方式
说明:成对成线的数据,利用对组可以返回两个数据

两种创建方式:

pair< type,type>p(value,value)
pair< type,typoe> p = make_pair(value,value)

例子:

#include 
using namespace std;
#include 
#include 

//pair对组的创建
void test()
{
     
	//第一种方式
	pair<string,int> p("Tom",20);
	cout<<"姓名:"<<p.first<<" 年龄:"<<p.second<<endl;

	//第二种
	pair<string,int>p1 = make_pair("小王",15);
	cout<<"姓名:"<<p1.first<<" 年龄:"<<p1.second<<endl;
}

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

运行结果:
在这里插入图片描述
———————————————————————————————————
7.set容器排序(改变排序规则)
set容器默认插入时从小到大排序,如何改变排序规则?

利用仿函数,可以改变排序规则,必须在插入数之前确定排序方式

例子:

#include 
using namespace std;
#include 
#include 

class Mycompare
{
     
public:
	bool operator()(int v1,int v2)  //创建一个带有bool类型的仿函数
	{
     
		return v1>v2;
	}
};

//pair对组的创建
void test()
{
     
	set<int,Mycompare> p;  //加入自己创建的类
	p.insert(10);
	p.insert(30);
	p.insert(20);
	p.insert(15);

	//遍历
	for(set<int,Mycompare>::iterator it = p.begin();it!=p.end();it++)
	{
     
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

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

运行结果:
在这里插入图片描述

若插入自定义数据,如何指定排序规则
例子:

#include 
using namespace std;
#include 
#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& p,const Person& p1)  //创建一个带有bool类型的仿函数
	{
     
		return p.m_age>p1.m_age;
	}
};

//pair对组的创建
void test()
{
     
	set<Person,Mycompare> st;  //创建容器
	Person p("小明",15);    //自定义数据
	Person p1("小红",14);
	Person p2("小王",16);
	Person p3("小李",20);
	st.insert(p);
	st.insert(p1);
	st.insert(p2);
	st.insert(p3);
	//遍历
	for(set<Person,Mycompare>::iterator it = st.begin();it!=st.end();it++)
	{
     
		cout<<"姓名:"<<it->m_name<<" 年龄:"<<it->m_age<<endl;
	}
}

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

运行结果:
set容器及multiset容器_第1张图片

你可能感兴趣的:(STL,c++)