zoukankan      html  css  js  c++  java
  • 使用二叉树实现CMap类封装

    #pragma once
    
    template<typename KEY, typename VALUE, typename ARG_KEY = KEY&, typename ARG_VALUE = VALUE&>
    class CMap
    {
    	struct SNode
    	{
    		KEY key;
    		VALUE value;
    		SNode *pLeft, *pRight;
    	};
    	SNode *m_pRoot;
    	int m_nSize;
    public:
    	typedef SNode * POSTION;
    	void SetAt(KEY key, ARG_VALUE value);
    	bool Lookup(KEY key, ARG_VALUE rValue) const;
    	ARG_VALUE operator[](KEY key);
    	void RemoveAll();
    	void RemoveKey(SNode * p);
    	CMap();
    	virtual ~CMap();
    	int GetSize()const
    	{
    		return m_nSize;
    	}
    	void * GetRootPoint() const
    	{
    		return m_pRoot;
    	}
    
    };
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    void CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::SetAt(KEY key, ARG_VALUE value)
    {
    	(*this)[key] = value;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    bool CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::Lookup(KEY key, ARG_VALUE rValue) const
    {
    	SNode *p = m_pRoot;
    	while (p)
    	{
    		if (p->key == key)
    		{
    			rValue = p->value;
    			return true;
    		}
    		else if (p->key > key)
    			p = p->pLeft;
    		else
    			p = p->pRight;
    	}
    	return false;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    ARG_VALUE CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::operator[](KEY key)
    {
    	SNode **p = &m_pRoot;
    	while (*p)
    	{
    		if ((*p)->key == key)
    			break;
    		else if ((*p)->key > key)
    			p = &((*p)->pLeft);
    		else
    			p = &((*p)->pRight);
    	}
    	if (*p)
    	{
    		return (*p)->value;
    	}
    	SNode *pNew = new SNode();
    	pNew->key = key;
    	*p = pNew;
    	++m_nSize;
    	return (*p)->value;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    void CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::RemoveAll()
    {
    	if (m_pRoot)
    		RemoveKey(m_pRoot);
    	m_pRoot = nullptr;
    	m_nSize = 0;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    void CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::RemoveKey(SNode * p)
    {
    	if (p->pLeft)
    		RemoveKey(p->pLeft);
    	if (p->pRight)
    		RemoveKey(p->pRight);
    	delete p;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::CMap()
    {
    	m_pRoot = nullptr;
    	m_nSize = 0;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::~CMap()
    {
    	RemoveAll();
    }
    

      

  • 相关阅读:
    原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
    vavr:让你像写Scala一样写Java
    Java黑科技之源:JVMTI完全解读
    JVM 源码解读之 CMS 何时会进行 Full GC
    MySQL 如何优化大分页查询?
    025:为什么需要将Logger对象声明为private static final类型的
    酷家乐一面二面
    趋势科技面试
    生活就是好好经历,无问西东----三月份总结
    30号快手笔试(三道ac两道半)————-历史上最大的网络失误orz
  • 原文地址:https://www.cnblogs.com/veis/p/12583131.html
Copyright © 2011-2022 走看看