多重集合set 的list实现详解

#ifndef MINIMULTISET_H
#define    MINIMULTISET_H
#include
#include
#include

using namespace std;

template
class miniMultiSet
{
    public:
        typedef typename list ::iterator iterator ;
        typedef typename list ::const_iterator const_iterator ;
        //miniMultiSet的迭代器就是list的迭代器

        miniMultiSet() ;

        miniMultiSet(T* first , T* last) ;
            //多重集,[first , last)
        bool empty() const ;

        int size() const ;

        int count(const T& item) const ;
        //返回item在多重集中重复出现的次数

        iterator find(const T& item) ;
        //指向第一个匹配元素,否则指向end

        const_iterator find(const T& item) const ;

        pair   equal_range(const T& item) ;

        pair   equal_range(const T& item) const ;
        //返回迭代器对 , 使得所有匹配item的元素都在区间[first ,last) ;

        iterator insert(const T& item) ;

        int erase(const T& item) ;

        void erase(iterator pos) ;

        void erase(iterator first , iterator last) ;

        iterator begin() ;

        const_iterator begin() const ;

        iterator end() ;

        const_iterator end() const ;

    private:
        list multisetList ;//使用list来实现多重集
        int distance(iterator first , iterator last) ;
        //返回区间[first, last)内的元素个数
        int distance(const_iterator first , const_iterator last) const;
        //常量版本
};

template
int miniMultiSet ::distance(iterator first , iterator last)
{
    int cnt ;
    iterator iter = first;
    while(iter != last)
    {
        cnt ++ ;
        iter ++ ;
    }
    return cnt ;

}

template
int miniMultiSet ::distance(const_iterator first , const_iterator last) const
{
    int cnt ;
    iterator iter = first ;
    while(iter != last)
    {
        cnt ++ ;
        iter ++ ;
    }
    return cnt ;
}

template
miniMultiSet ::miniMultiSet()
{

}

template
miniMultiSet ::miniMultiSet(T* first , T* last)
{
    T* tmp = first ;

    while(tmp != last)
    {
        insert(*tmp);
        tmp ++ ;
    }
}

template
bool miniMultiSet ::empty() const
{
    return multisetList.empty() ;
}

template
int miniMultiSet ::size() const
{
    return multisetList.size() ;
}

template
int miniMultiSet ::count(const T& item) const
{
    int cnt = 0 ;
    const_iterator iter ;
    pair   p ;
     p = equal_range(item) ;

     if (p.first == end())
     {
         cnt = 0 ;
     }
     else
     {
         iter = p.first ;
         while(iter != p.second)
         {
             cnt ++ ;
             iter ++ ;
         }
     }

    return cnt ;
}

template
miniMultiSet ::iterator miniMultiSet ::find(const T& item)
{
    iterator iter = begin() ;
    while((iter != end()) && (*iter != item)  )
        iter ++ ;
    return iter ;

}

template
miniMultiSet ::const_iterator  miniMultiSet ::find(const T& item) const
{
    const_iterator iter = begin() ;

    while((iter != end()) &&(*iter != item) )
        iter ++ ;

    return iter ;

}

template
pair ::iterator , miniMultiSet ::iterator >  miniMultiSet ::equal_range(const T& item)
{
    pair p ;
    p.first = find(item);
    if (p.first == end())
    {
        p.second = end();
        return  p ;
    }

    iterator iter = p.first ;

    while((iter != end()) && (*iter == item))
    {
        iter ++ ;
        p.second = iter ;
    }

    return p ;
}

template
pair ::const_iterator , miniMultiSet ::const_iterator >  miniMultiSet ::equal_range(const T& item) const
{
    pair p ;

    p.first = find(item) ;

    if (p.first == end())
    {
        p.second = end() ;
        return p ;
    }

    const_iterator iter = p.first ;
    while((iter != end()) && (*iter == item))
    {
        iter ++ ;
        p.second = iter ;
    }

    return p ;

}

template
miniMultiSet ::iterator miniMultiSet ::insert(const T& item)
{
    iterator iter ;
    iter = find(item);

    multisetList.insert(iter,item) ;

    iter = find(item) ;

    return iter ;

}

template
int miniMultiSet ::erase(const T& item)
{
    int cnt = 0 ;
    iterator iter = find(item) ;

    if (iter != end())
    {
        while((*iter == item) && (iter != end()))
        {
            multisetList.erase(iter ++ );
            cnt     ++  ;
        }
    }
    else
        cnt = 0 ;

        return cnt ;
}

template
void miniMultiSet ::erase(iterator pos)
{
    multisetList.erase(pos) ;
}

template
void miniMultiSet ::erase(iterator first , iterator last)
{
    iterator iter = first ;

    while(iter != last)
    {
        multisetList.erase(iter ++ ) ;
    }
}

template
miniMultiSet ::iterator  miniMultiSet ::begin()
{
    iterator iter = multisetList.begin() ;
    return iter ;
}

template
miniMultiSet ::const_iterator  miniMultiSet ::begin() const
{
    return multisetList.begin() ;
}

template
miniMultiSet ::iterator miniMultiSet ::end()
{
    return multisetList.end() ;   
}

template
miniMultiSet ::const_iterator  miniMultiSet ::end() const
{
    return multisetList.end() ;   
}

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值