【C++】C++使用内置容器实现自定义容器
@TOC
MySet容器实现
MySet .hpp
#ifndef _myset
#define _myset
#include<iostream>
#include<set>
using namespace std;
//基于set容器来实现MySet自定义容器
//参数1为 里面存的数据类型 参数2 用哪种容器来实现,并且默认为set容器
/*
* 注:
在模板(template)中使用一个嵌套从属类型名称, 需要在前一个位置, 添加关键字。
就是在这个容器中使用另一个容器,当用类名调用的时候要加上前缀typename
*/
template<class _ty,class _container = set<_ty>>
class MySet
{
public:
//重命名——便于书写
typedef MySet<_ty, _container> _MySet;
//用基于的容器来初始化咱们这个MySet容器
MySet() :c()
{
}
~MySet()
{
}
//拷贝构造函数-根据传进来的MySet容器
MySet(const _MySet& _Right) :c(_Right.c)
{
}
//拷贝构造函数-根据传进来的容器种类
MySet(const _container* _Left) :c(_Left)
{
}
//重载赋值运算符
_MySet& operator=(const _MySet& _Right)
{
this->c = _Right.c;
return *this;
//返回引用-内容-所以要*this指针得到内容并返回
}
//插入元素-调用set容器-用返回值判断是否插入成功
bool insert(const _ty& _Val)
{
pair<typename _container::iterator, bool>ret = c.insert(_Val);
if (ret.second)
{
cout << _Val << "插入成功" << endl;
return true;
}
else
{
cout << _Val << "插入失败" << endl;
return false;
}
}
//检查容器是否为空-直接调用set容器接口
bool empty()const
{
return c.empty;
}
//删除操作-直接调用set容器接口来判断
bool erase(const _ty& _Val)
{
if (c.erase(_Val) > 0)//存在并删除成功返回删除元素的个数,反之返回0
{
return true;
}
return false;
}
//当前容器长度-直接调用set容器接口
int size()const
{
return c.size();
}
//得到当前容器的最大值-因为是有以set容器实现的,第一个是最小的,最后一个是最大的
//返回对组的用处在这里体现了,对组中可以存一个值+一个bool,来判断是否成功。
pair<_ty, bool> GetMax()const
{
pair<_ty, bool>ret;
typename _container::iterator max = c.end();
//先判断容器中是否有东西
if (c.size() > 0)
{
ret.first = *(--max);
ret.second = true;
return ret;
}
else
{
ret.second = false;
return ret;
}
}
//得到最小值
//核心容器的::value_type 和_ty-传进来的数据类型相同
pair<_ty, bool> GetMin()const
{
pair<_ty, bool>ret;
typename _container::iterator min = c.begin();
//判断是否存在
if (min != c.end())
{
ret.first = *c.begin();
ret.second = true;
return ret;
}
else
{
ret.second = false;
return ret;
}
}
void print()const
{
for (typename _container::iterator it = c.begin(); it != c.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
protected:
//基于哪种容器实现
_container c;
};
#endif
main.cpp
#include<iostream>
#include"MySet.hpp"
using namespace std;
int main(void)
{
MySet<int>ms1;
ms1.insert(5);
ms1.insert(15);
ms1.insert(25);
pair<int,bool>ret = ms1.GetMax();
if (ret.second)
{
cout <<"找到了,最大值是:" << ret.first << endl;
}
else
{
cout << "找不到" << endl;
}
pair<int, bool>ret2 = ms1.GetMin();
if (ret2.second)
{
cout << "找到了,最小值是:" << ret2.first << endl;
}
else
{
cout << "找不到" << endl;
}
ms1.print();
MySet<int>ms2(ms1);
ms2.print();
ms2.erase(15);
MySet<int>ms3;
ms3 = ms2;
ms3.print();
return 0;
}
SizeFilter容器实现
SizeFilter.hpp
#ifndef _SIZEFILTER
#define _SIZEFILTER
#include<iostream>
#include<set>
template<class _Ty,class _Container = set<_Ty>>//第二个模板参数是默用set容器来实现这个新容器的功能
class sizeFilter
{
public:
typedef sizeFilter<_Ty, _Container> _Myt;
/*
在模板(template)中使用一个嵌套从属类型名称, 需要在前一个位置, 添加关键字。
就是在这个容器中使用另一个容器,当前类容器时模板,要加上前缀typename
*/
//用核心容器中的类型(用set容器中的size_type 来当我们这个新容器的size_type)
typedef typename _Container::size_type size_type;
typedef typename _Container::value_type value_type;
sizeFilter() :c()
{
//默认构造函数。初始化内置容器
}
sizeFilter(const _Myt& _Right) :c(_Right.c)
{
//构造函数,通过指定特定的sizeFilter容器构造
}
sizeFilter(const _Container& _Cont) :c(_Cont)
{
//构造函数,通过指定特定的容器构造
}
_Myt& operator= (const _Myt& _Right)
{
//使用sizefilter给另一个sizefilter赋值
c = _Right.c;
return (*this);
}
bool empty()const
{
//用核心容器的功能
return c.empty();
}
size_type size()const
{
return c.size();
}
bool insert(const value_type& _Val)
{
_Container::iterator ci = c.insert(c.begin(), _Val);
if (ci != c.end())
{
std::cout << "插入:" << _Val << "成功" << std::endl;
return true;
}
std::cout << "插入:" << _Val << "失败" << std::endl;
}
bool erase(const value_type& _Val)
{
if (c.erase(_Val) > 0)
{
return true;
}
return false;
}
//set容器自动排序,默认升序排列,第一个为min,最后一个为max
std::pair<value_type, bool> getMin()//获取最小值
{
std::pair<value_type, bool> ret;
typename _Container::iterator min = c.begin();
if (min != c.end())//存在最小值
{
ret.first = *min;
ret.second = true;
return ret;
}
ret.second = false;
return ret;
}
std::pair<value_type, bool> getMax()//获取最大值
{
std::pair<value_type, bool>ret;
typename _Container::iterator max = c.end();
if (c.size() > 0)//只要容器不是空的,里面就能取到最大值
{
ret.first = *(--max);
ret.second = true;
return ret;
}
ret.second = false;
return ret;
}
protected:
_Container c;//基于哪个容器实现的,这个c就是什么类型的容器
};
#endif
main.cpp
#include<iostream>
#include"SizeFilter.hpp"
#include<string>
#include<set>
using namespace std;
int main(void)
{
sizeFilter<int> sf;
//插入
sf.insert(5);
pair<sizeFilter<int>::value_type, bool>ret = sf.getMax();
if (ret.second)
{
cout <<"最大值是:" <<ret.first<< endl;//看迭代器里面是什么内容来决定操作
}
else
{
cout << "没找到" << endl;
}
pair<sizeFilter<int>::value_type, bool>ret2 = sf.getMin();
if (ret2.second)
{
cout << "最小值是:" << ret.first << endl;
}
else
{
cout << "没找到" << endl;
}
return 0;
}