【C++】C++使用内置容器实现自定义容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【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;
}
相关文章
|
2月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
133 2
|
5月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
93 0
|
6月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
108 5
|
6月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
133 2
|
6月前
|
设计模式 存储 C++
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现(二)
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现
|
6月前
|
存储 C++ 容器
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现(一)
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现
|
2月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1天前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
32 12
|
1月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
48 16