STL项目练习
- 实现一个通用的容器
- 能够支持插入多种不同的普通类型(包含 int char float double 等)和自定义结构体和自定义类的对象
- 并能根据每种不同类型的比较规则从容器中取得最大或最小的那个值或对象
分 析
通用的容器 - 自己开发 or 重用STL现有容器?
支持插入多种类型 - 非模板莫属
取最大最小值 - 函数对象(仿函数)? or set/multiset
接口设计 - sizeFilter
1. 构造函数
2 .赋值运算符重载
3. 大小
4. 插入和删除
5. 查找最大值和最小值
SizeFilter.hpp
#pragma once
#include <iostream>
#include <set>
using namespace std;
template <class _Ty,
class _Container = set<_Ty>>
class SizeFilter {
public:
typedef SizeFilter<_Ty, _Container> _Myt;
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& _other) const { //赋值运算
this->c = _other.c;
return (*this);
}
bool empty() { //测试是否为空
return (c.empty());
}
size_type size() { //获取容器元素长度
return (c.size());
}
bool insert(const value_type& _Val) { //插入元素
pair<_Container::iterator, bool> it = c.insert(_Val);
if (it.second) {
cout << "Insert value:" << _Val << " Succeed!" << endl;
return true;
} else {
cout << "Insert value:" << _Val << " Fail!" << endl;
return false;
}
}
bool erase(const value_type& _Val) { //删除元素方式1
typename _Container::iterator it = c.begin();
for (; it != c.end();) {
if (*it == _Val) {
it = c.erase(it);
cout << "Erasr value: " << _Val << " Succeed!" << endl;
return true;
} else {
it++;
}
}
cout << "Erasr value:" << _Val << " Fail!" << endl;
return false;
}
/*bool erase(const value_type& _Val) const { //删除元素方式2
if (c.erase(_Val)>0) {
cout << "Erasr value:" << _Val << "S ucceed!" << endl;
return true;
}
return false;
}*/
typedef pair<value_type, bool> _Pair;
_Pair getMin() { //获取最小值
_Pair ret;
typename _Container::iterator min = c.begin(); //第一个就是最小值
if (min != c.end()) {
ret.first = *min;
ret.second = true;
return ret;
}
ret.second = false;
return ret;
}
_Pair getMax() { //获取最大值
_Pair 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;
};
main.cpp
#include <iostream>
#include <Windows.h>
#include "SizeFilter.hpp"
int main(void){
SizeFilter<int> s1;
s1.insert(3); //测试插入数据
s1.insert(10); //测试插入数据
s1.insert(666); //测试插入数据
s1.erase(10); //测试擦除数据
pair<int, bool> it;
it = s1.getMax(); //测试获取最大值
cout << "Max: " << it.first << endl;
it = s1.getMin(); //测试获取最小值
cout << "Min: " << it.first << endl;
cout << "元素个数: " << s1.size() << endl; //测试获取容器大小
system("pause");
return 0;
}