• 使用二叉树实现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();
    }
    

      

  • 相关阅读:
    ASP.NET网页动态添加数据行
    动态生成自定义控件ascx如何给ascx传值
    读取txt文件将文本行组合成特定格式
    怎样对文本文件内的文本行排序
    动态变更Repeater控件HeaderTemplate列名
    减少代码冗余,封装你的程序
    在Repeater控件的OnItemDataBound获取数据源记录总数
    查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
    Nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
    gerrit代码简单备份方案分享
  • 原文地址:https://www.cnblogs.com/veis/p/12583131.html
Copyright © 2020-2023  润新知