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();
    }
    

      

  • 相关阅读:
    restframework 使用OrderingFilter实现排序
    restframework 使用django_filters 实现过滤
    Serializer 嵌套使用
    docker 运行scrpyd
    flutter-lol云顶之弈助手app
    微信小程序上传多张图片,后端只保存了最后一张的Bug
    ettercap局域网arp欺骗,轻松窃密
    GoLang邮件发送Demo(继上篇msmtp)
    Mac下命令行发邮件【搭配php(shell_exec...)等脚本语言,轻松发邮件,告别各种依赖库】
    我的第一个RN应用(漂亮的首页和笑话列表)
  • 原文地址:https://www.cnblogs.com/veis/p/12583131.html
Copyright © 2011-2022 走看看