工具类库系列(十六)-rangmap

rangmap是一个对map的简单封装,用于实现对若干个互不重叠的闭区间的 增删改查


我们通常会有这样的需求,比如:

若干个IP地址的闭区间:127.0.0.50 -127.0.0.100,127.0.0.101-127.0.0.149,127.0.0.200-127.0.0.249,这个不同的ip区间可能是对应了3个不同的房间中的机器,每个区间对应一个房间

现在需要搜索 某一个具体ip,是属于哪个房间的。


于是,就存在一个区间的搜索的问题。我们需要一颗允许进行区间查找的树,这棵树的key是一种区间类型。


这个区间类型,封装2个值:begin,end,分别表示闭区间的两端。

我们用模板 rang<K>,来表示这个区间类型,K应该是支持 < (小于) 这个比较运算符的一种数据类型


因为是互不重叠的闭区间,所以这个区间类型的比较函数:

bool operator<(const rang<K>& other) const
{
	if (m_begin < other.m_begin && m_end < other.m_begin)
	{
		return true;
	}
	else
	{
		return false;
	}
}

因此如果出现重叠的区间,将会被视为同一个区间,因此使用的时候需要注意

其他的就是一些对map常用功能的封装:迭代,find,erase,下标运算符,等


给出具体代码

rangmap.h

#ifndef __RangMap_h__
#define __RangMap_h__

#include <map>

namespace common {
	namespace tool {

		template <class K, class V>
		class rangmap
		{
		public:
			template <class K>
			class rang
			{
			public:
				rang()
				{

				}
				rang(const K& begin, const K& end)
				{
					m_begin = begin;
					m_end = end;
				}
				rang(const rang<K>& other)
				{
					*this = other;
				}
				~rang()
				{

				}
				rang<K>& operator=(const rang<K>& other)
				{
					m_begin = other.m_begin;
					m_end = other.m_end;
					return *this;
				}

				bool operator<(const rang<K>& other) const
				{
					if (m_begin < other.m_begin && m_end < other.m_begin)
					{
						return true;
					}
					else
					{
						return false;
					}
				}

				const K& begin() const
				{
					return m_begin;
				}
				const K& end() const
				{
					return m_end;
				}

			private:
				K m_begin;
				K m_end;
			};

			template <class K, class V>
			using rangmap_it = typename std::map<rang<K>, V>::iterator;
			template <class K, class V>
			using rangmap_cit = typename std::map<rang<K>, V>::const_iterator;
			template <class K, class V>
			using rangmap_rit = typename std::map<rang<K>, V>::reverse_iterator;
			template <class K, class V>
			using rangmap_crit = typename std::map<rang<K>, V>::const_reverse_iterator;

		public:
			V& operator[](const K& key)
			{
				return m_map[rang<K>(key, key)];
			}
			V& operator[](const rang<K>& key)
			{
				return m_map[key];
			}

			rangmap_it<K, V> begin()
			{
				return m_map.begin();
			}
			rangmap_it<K, V> end()
			{
				return m_map.end();
			}
			rangmap_cit<K, V> begin() const
			{
				return m_map.begin();
			}
			rangmap_cit<K, V> end() const
			{
				return m_map.end();
			}

			rangmap_rit<K, V> rbegin()
			{
				return m_map.rbegin();
			}
			rangmap_rit<K, V> rend()
			{
				return m_map.rend();
			}
			rangmap_crit<K, V> rbegin() const
			{
				return m_map.rbegin();
			}
			rangmap_crit<K, V> rend() const
			{
				return m_map.rend();
			}

			rangmap_it<K, V> find(const K& key)
			{
				return m_map.find(rang<K>(key, key));
			}
			rangmap_it<K, V> find(const rang<K>& key)
			{
				return m_map.find(key);
			}
			rangmap_cit<K, V> find(const K& key) const
			{
				return m_map.find(rang<K>(key, key));
			}
			rangmap_cit<K, V> find(const rang<K>& key) const
			{
				return m_map.find(key);
			}

			rangmap_it<K, V> erase(rangmap_cit<K, V> it)
			{
				return m_map.erase(it);
			}
			rangmap_it<K, V> erase(rangmap_cit<K, V> begin, rangmap_cit<K, V> end)
			{
				return m_map.erase(begin, end);
			}
			size_t erase(const K& key)
			{
				return m_map.erase(rang<K>(key, key));
			}
			size_t erase(const rang<K>& key)
			{
				return m_map.erase(key);
			}

			size_t size() const
			{
				return m_map.size();
			}
			bool empty() const
			{
				return (size() == 0);
			}
			void clear()
			{
				m_map.clear();
			}

		private:
			std::map<rang<K>, V> m_map;
		};
	}
}

#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值