类模板练习--万能择优器
项目需求:
程序员Jack 的团队新接手了一个底层的项目,项目经理要求Jack 实现一个通用的容器,能够支持插入多种不同的普通类型(包含 int char float double 等)和自定义结构体和自定义类的对象,并能根据每种不同类型的比较规则从容器中取得最大或最小的那个值或对象。
接口设计: - sizeFilter
构造函数
赋值运算符重载
大小
插入和删除
查找最大值和最小值
//---------- sizeFilter.h ----------
#pragma once
#include <iostream>
#include <set>
using namespace std;
template<typename _Ty, typename _Container = set<_Ty>>
class sizeFilter
{
public:
typedef sizeFilter<_Ty, _Container> _Myt;
typedef typename _Container::size_type size_type;
typedef typename _Container::iterator iterator;
typedef typename _Container::value_type value_type;
sizeFilter() :c()
{
//默认构造函数
}
sizeFilter(const _Myt& _Right):c(_Right.c)
{
// 拷贝构造函数
}
sizeFilter(const _Container& _Cont) :c(_Cont.c)
{
// 用容器对象来进行初始化
}
_Myt& operator=(const _Myt& _Right)
{
c = _Right.c;
return *this;
}
// 判断是否为空
bool empty() const
{
return (c.empty());
}
// 判断长度
size_type size() const
{
return (c.size());
}
// 插入元素
iterator emplace_hint(const value_type& _Val)
{
return c.emplace_hint(c.begin(), _Val);
}
// 删除元素
size_type erase(const value_type& _Val)
{
return c.erase(_Val);
}
// 获取最大值
pair<value_type, bool> getMax() const
{
pair<value_type,bool> ret;
if (!(c.empty()))
{
// c中存在元素
ret.first = *(--c.end());
ret.second = true;
}
else
{
ret.second = false;
}
return ret;
}
// 获取最小值
pair<value_type, bool> getMin() const
{
pair<value_type, bool> ret;
if (!(c.empty()))
{
// 存在最小值
ret.first = *(c.begin());
ret.second = true;
}
else
{
ret.second = false;
}
return ret;
}
protected:
_Container c;
};
//--------- main --------
#include "SizeFilter.h"
#include <set>
int main()
{
sizeFilter<int, multiset<int>> s1;
s1.emplace_hint(5);
s1.emplace_hint(1);
s1.emplace_hint(4);
s1.emplace_hint(3);
s1.emplace_hint(7);
pair<int,bool>max = s1.getMax();
if (max.second)
{
cout << "最大值:" << max.first << endl;
}
else
{
cout << "没有最大值" << endl;
}
pair<int, bool>min = s1.getMin();
if (min.second)
{
cout << "最小值" << min.first << endl;
}
else
{
cout << "没有最小值" << endl;
}
if (s1.empty())
{
cout << "集合为空" << endl;
}
else
{
cout << "集合不为空" << endl;
}
cout << "集合的长度是" << s1.size() << endl;
s1.erase(7);
s1.erase(1);
cout << endl << "测试删除" << endl;
max = s1.getMax();
if (max.second)
{
cout << "最大值:" << max.first << endl;
}
else
{
cout << "没有最大值" << endl;
}
min = s1.getMin();
if (min.second)
{
cout << "最小值" << min.first << endl;
}
else
{
cout << "没有最小值" << endl;
}
if (s1.empty())
{
cout << "集合为空" << endl;
}
else
{
cout << "集合不为空" << endl;
}
cout << "集合的长度是" << s1.size() << endl;
return 0;
}