//广义表

//广义表
template< class _ID_TYPE,  class _V_TYPE>
class CLK_General_Map
{
public:
	typedef vector< _V_TYPE >						Map_Items_Type;
	typedef map< _ID_TYPE, Map_Items_Type* >		General_Map_Type;

	class Items
	{
	public:
		Items(General_Map_Type* _p_general_map,  _ID_TYPE _ID):m_p_general_map(_p_general_map), m_ID(_ID){}
		bool is_exist()
		{
			if( 0 == (*m_p_general_map)[m_ID])
				return false;
			return true;
		}
		bool push(_V_TYPE _val)
		{
			if( 0 == (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = new Map_Items_Type();
				(*m_p_general_map)[m_ID] = pItems;
			}
			_V_TYPE pItem = get_item(_val);
			if( NULL == pItem)
			{
				(*m_p_general_map)[m_ID]->push_back(_val);
				return true;
			}
			else
			{
				return false;
			}
		}

		_V_TYPE get_item(_V_TYPE _val)
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				Map_Items_Type::iterator pIt = find(pItems->begin(), pItems->end(), _val);
				if( pIt != pItems->end())
					return *pIt;
			}
			return NULL;
		}

		void remove(_V_TYPE _val)
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				Map_Items_Type::iterator it = find(pItems->begin(),pItems->end(),_val);
				pItems->erase(it);
			}
		}

		vector< _V_TYPE >* get_set()
		{
			return (*m_p_general_map)[m_ID];
		}

		void erase()
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				pItems->clear();
				delete pItems;
				pItems = NULL;
				(*m_p_general_map)[m_ID] = NULL;
				(*m_p_general_map).erase(m_ID);
			}
		}

	private:
		General_Map_Type* m_p_general_map;
		_ID_TYPE m_ID; 
	};


	Items get_manager(_ID_TYPE _ID)
	{
		Items it(&m_general_map, _ID);
		return it;
	}

	void clear()
	{
		General_Map_Type::iterator it = m_general_map.begin();
		while(it != m_general_map.end())
		{
			get_manager(it->first).erase();
			it = m_general_map.begin();
		}
	}

	size_t get_all_size()
	{
		struct MapCount
		{
			MapCount():m_count(0){}
			void operator()(pair<_ID_TYPE, Map_Items_Type*> _items){ m_count += _items.second->size(); }
			int m_count;
		};
		MapCount map_count = for_each(m_general_map.begin(),m_general_map.end(),MapCount());
		return map_count.m_count;
	}


private:
	General_Map_Type m_general_map;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值