您的位置:首页 > 其它

多重集合set 的list实现详解

2010-09-03 21:18 267 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: