STL 中的 set/multiset functor pair

1.知识点

在这里插入图片描述

2.源代码

#include <iostream>
#include <string>
#include <tchar.h>
#include <set>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//1.set/multiset对象的默认构造
	//set采用模板类实现,set/multiset对象的默认构造形式:set<T> setT;  multiset<T> multisetT; 如:
	//尖括号内可以还设置各种指针类型或自定义类型。
	cout << "1.set/multiset对象的默认构造\n";
	set<int> setInt;//一个存放int的set容器。set<int> 相当于 set<int,less<int>>

	//2.set的插入与迭代器
	cout << "2.set的插入与迭代器\n\n";
	cout << "2.1set的默认排序:升序\n";
	
	setInt.insert(3);
	setInt.insert(1);
	setInt.insert(5);
	setInt.insert(2);
	setInt.insert(2);//set所包含的元素是唯一的,即便你插入多个相同的元素,结果里面还是只有一个
	setInt.insert(2);
	setInt.insert(2);

	for (set<int>::iterator it = setInt.begin(); it != setInt.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//2.2set的降序排序
	cout << "2.2set的降序排序:\n";
	set<int, greater<int>> setInt2;//该容器是按降序方式排列元素。
	setInt2.insert(3);
	setInt2.insert(1);
	setInt2.insert(5);
	setInt2.insert(2);
	setInt2.insert(2);//set所包含的元素是唯一的,即便你插入多个相同的元素,结果里面还是只有一个
	setInt2.insert(2);
	setInt2.insert(2);

	for (set<int>::iterator it = setInt2.begin(); it != setInt2.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//如果set<>不包含int类型,而是包含自定义类型,set容器如何排序?--functor
	//3.函数对象functor的用法
	cout << "3.函数对象functor的用法:\n";
	//题目:学生包含学号,姓名属性,现要求任意插入几个学生对象到set容器中,使得容器中的学生按学号的升序排序
	//3.1学生类
	class CStudent
	{
	public:
		CStudent(int iID, string strName)//构造函数
		{
			m_iID = iID;
			m_strName = strName;
		}

		int GetiID() const { return m_iID; }
		string GetStrName() const { return m_strName; }


	private:
		int m_iID;//学号
		string m_strName;//姓名
	};
	//3.2函数对象
	struct StuFunctor
	{
		bool operator()(const CStudent& stu1, const CStudent& stu2) const //注意:这里必须加上const,否则会报错
		{
			return(stu1.GetiID() < stu2.GetiID());
		}
	};
	//3.3在 main函数中调用
	set<CStudent, StuFunctor> setStu;
	setStu.insert(CStudent(3, "小张"));
	setStu.insert(CStudent(1, "小钱"));
	setStu.insert(CStudent(5, "小王"));
	setStu.insert(CStudent(2, "小刘"));

	//3.4遍历
	for (set<CStudent, StuFunctor>::iterator it = setStu.begin(); it != setStu.end(); ++it)
	{
		
		cout << it->GetiID() << "  " << it->GetStrName() << endl;
	}
	cout << "\n\n";

	//4.set对象的拷贝构造与赋值
	cout << "4.set对象的拷贝构造与赋值\n";
	set<int> setIntA;
	setIntA.insert(3);
	setIntA.insert(1);
	setIntA.insert(5);
	setIntA.insert(2);

	set<int> setIntC;
	setIntC.insert(30);
	setIntC.insert(10);
	setIntC.insert(50);
	setIntC.insert(20);

	//遍历set对象setIntA
	cout << "遍历set对象setIntA\n";
	for (set<int>::iterator it = setIntA.begin(); it != setIntA.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//遍历set对象setIntC
	cout << "遍历set对象setIntC\n";
	for (set<int>::iterator it = setIntC.begin(); it != setIntC.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	
	//4.1set对象的拷贝构造函数:set(const set &st);
	cout << "4.1set对象的拷贝构造函数:set(const set &set);\n";
	set<int> setIntB(setIntA);

	//遍历set对象setIntB
	for (set<int>::iterator it = setIntB.begin(); it != setIntB.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//4.2set对象的重载等号操作符:set& operator=(const set &st);
	cout << "4.2set对象的重载等号操作符:set& operator=(const set &st);\n";
	set<int> setIntD;
	setIntD = setIntC;

	//遍历set对象setIntD
	for (set<int>::iterator it = setIntD.begin(); it != setIntD.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//4.3交换两个集合容器:set.swap(st);
	cout << "4.3交换两个集合容器:set.swap(st);\n";
	setIntA.swap(setIntC);

	//遍历set对象setIntA
	cout << "遍历set对象setIntA\n";
	for (set<int>::iterator it = setIntA.begin(); it != setIntA.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//遍历set对象setIntC
	cout << "遍历set对象setIntC\n";
	for (set<int>::iterator it = setIntC.begin(); it != setIntC.end(); ++it)
	{
		int iItem = *it;
		cout << iItem << " ";
	}
	cout << "\n\n";

	//5.set的大小 set.size(); set.empty();
	cout << "5.set的大小 set.size(); set.empty();\n";
	set<int> setIntE;
	setIntE.insert(3);
	setIntE.insert(1);
	setIntE.insert(5);
	setIntE.insert(2);
	setIntE.insert(2);
	setIntE.insert(2);
	setIntE.insert(2);

	if (setIntE.empty() == false)
	{
		cout << "setIntE的大小是:" << setIntE.size() << endl;
	}
	else
	{
		cout << "setIntE为空" << endl;
	}

	cout << "\n\n";

	//6.set的查找
	cout << "6.set的查找\n";
	set<int> setIntF;
	setIntF.insert(3);
	setIntF.insert(1);
	setIntF.insert(5);
	setIntF.insert(2);
	setIntF.insert(9);
	setIntF.insert(8);
	setIntF.insert(20);

	//6.1 set.find(elem);查找elem元素,返回指向elem元素的迭代器。
	cout << "6.1 set.find(elem);查找elem元素,返回指向elem元素的迭代器。\n";
	set<int>::iterator it1 = setIntF.find(5);
	cout << "setIntF中元素5的迭代器指向的值是:" << *it1 << endl << endl;

	//6.2 set.count(elem);   
	//返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。
	cout << "6.2 set.count(elem); \n";
	int count1 = setIntF.count(3);
	cout << "setIntF中元素5的个数是:" << count1 << endl << endl;

	//6.3 set.lower_bound(elem);  返回第一个 >= elem 元素的迭代器。
	cout << "6.3 set.lower_bound(elem);  返回第一个 >= elem 元素的迭代器\n";
	set<int>::iterator it2 = setIntF.lower_bound(9);//请注意:由于set默认按升序排列,所以返回值指向的是8而不是9
	cout << "setIntF元素中第一个大于或等于9的元素的迭代器指向的值是:" << *it2 << endl << endl;

	//6.4 set.upper_bound(elem);  返回第一个>elem元素的迭代器。
	cout << "6.4 set.upper_bound(elem);  返回第一个>elem元素的迭代器。\n";
	set<int>::iterator it3 = setIntF.upper_bound(9);
	cout << "setIntF元素中第一个大于9的元素的迭代器指向的值是:" << *it3 << endl << endl;

	//6.5 set.equal_range(elem);返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。
	//以上函数返回两个迭代器,而这两个迭代器被封装在pair中。以下讲解pair的含义与使用方法。
	//返回值:一个pari对象. pair::first是指向子范围左边界的迭代器. pair::last是指向子范围有边界的迭代器.
	//       它们的值和lower_bound,upper_bound分别返回的值相同.
	
	cout << "6.5 set.equal_range(elem);返回容器中与elem相等的上下限的两个迭代器。\n";

	pair<set<int>::iterator, set<int>::iterator>itPair = setIntF.equal_range(9);

	set<int>::iterator itFirst = itPair.first;
	set<int>::iterator itSecond = itPair.second;

	cout << "set.equal_range(elem)返回的值:" << *itFirst << " " << *itSecond << endl << endl;


	//7.set的删除
	cout << "7.set的删除\n";
	set<int> setIntG;
	setIntG.insert(3);
	setIntG.insert(1);
	setIntG.insert(5);
	setIntG.insert(2);
	setIntG.insert(9);
	setIntG.insert(8);
	setIntG.insert(20);

	//遍历set对象setIntG
	cout << "遍历set对象setIntG,刚开始的时候\n";
	for (set<int>::iterator it = setIntG.begin(); it != setIntG.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << "\n\n";

    //7.1 set.erase(elem); 删除容器中值为elem的元素。
	cout << "7.1 set.erase(elem); 删除容器中值为elem的元素。\n";

	setIntG.erase(3);

	//遍历set对象setIntG
	cout << "遍历set对象setIntG,现在\n";
	for (set<int>::iterator it = setIntG.begin(); it != setIntG.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << "\n\n";

	//7.2 set.erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器。
	cout << "7.2 set.erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器。\n";
	set<int>::iterator it_erase1 = ++setIntG.begin();//set仅支持双向迭代器,所以只能++或--
	setIntG.erase(it_erase1);

	//遍历set对象setIntG
	cout << "遍历set对象setIntG,现在\n";
	for (set<int>::iterator it = setIntG.begin(); it != setIntG.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << "\n\n";

	//7.3 set.clear();清除所有元素
	cout << "7.3 set.clear();清除所有元素\n";

	setIntG.clear();

	//遍历set对象setIntG
	cout << "遍历set对象setIntG,现在\n";
	for (set<int>::iterator it = setIntG.begin(); it != setIntG.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << "\n\n";


	return 0;
}

3.运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值