非排序map的适配器

以前写过的一些代码,拿出来与大家分享一下,在看代码前先交代清楚它的优缺点,顾名思义此适配器去除了std::map按key排序的特性,元素的排序按我们插入的顺序排列,因此失去了二分查找的性能,查询的时间为常数N。在我们不希望std::map排序元素,且保存元素较少的情况下,这是个不错的解决方案。

Map.h

#pragma once
#include <vector>
#include <utility>

namespace std
{
	template
		<
			class K,
			class V,
			class A = allocator< pair<K, V> >
		>
	class Map 
		: private vector< pair<K, V>, A >
	{
		typedef vector<pair<K, V>, A> Base;

	public:
		typedef K key_type;
		typedef V mapped_type;
		typedef typename Base::value_type value_type;

		typedef typename Base::iterator iterator;
		typedef typename Base::const_iterator const_iterator;
		typedef typename Base::size_type size_type;
		typedef typename Base::reverse_iterator reverse_iterator;
		typedef typename Base::const_reverse_iterator const_reverse_iterator;


		explicit Map(
			const A& alloc = A())
			: Base(alloc)
		{}

		template <class InputIterator>
		Map(InputIterator first, InputIterator last, 
			const A& alloc = A())
			: Base(first, last, alloc)
		{

		}

		Map& operator=(const Map& rhs)
		{ 
			Map(rhs).swap(*this); 
			return *this;
		}

		iterator begin() { return Base::begin(); }
		const_iterator begin() const { return Base::begin(); }
		iterator end() { return Base::end(); }
		const_iterator end() const { return Base::end(); }
		reverse_iterator rbegin() { return Base::rbegin(); }
		const_reverse_iterator rbegin() const { return Base::rbegin(); }
		reverse_iterator rend() { return Base::rend(); }
		const_reverse_iterator rend() const { return Base::rend(); }

		bool empty() const { return Base::empty(); }
		size_type size() const { return Base::size(); }
		size_type max_size() { return Base::max_size(); }

		mapped_type& operator[](const key_type& key)
		{ 
			if (find(key) != end())
			{
				return find(key)->second;
			}
			else{
				push_back(value_type(key,mapped_type()));
				return find(key)->second;
			}
		}

		void insert(const value_type& val)
		{
			Base::push_back(val);
		}

		iterator insert(iterator pos, const value_type& val)
		{
				return Base::insert(pos, val);
		}

		template <class InputIterator>
		void insert(InputIterator first, InputIterator last)
		{ 
			for (; first != last; ++first) 
				insert(*first); 
		}

		void erase(iterator pos)
		{ Base::erase(pos); }

		size_type erase(const key_type& k)
		{
			iterator i(find(k));
			if (i == end()) return 0;
			erase(i);
			return 1;
		}

		void erase(iterator first, iterator last)
		{ Base::erase(first, last); }

		void swap(Map& other)
		{
			Base::swap(other);
		}

		void clear()
		{ Base::clear(); }

		iterator find(const key_type& k)
		{
			iterator i(Base::begin());
			for (;i!=Base::end();++i)
			{
				if(i->first == k)
					return i;
			}
			
			return i;
		}

		const_iterator find(const key_type& k) const
		{       
			const_iterator i(Base::begin());
			for (;i!=Base::end();++i)
			{
				if(i->first == k)
					return i;
			}
			return i;
		}

		size_type count(const key_type& k) const
		{ 
			size_type i = 0;
			for (const_iterator i = Base::begin();i!=Base::end();++i)
			{
				if (i->first == k)
				{
					++i;
				}				
			}
			return i;
		}
	};
} 

main.cpp //对比std::map

#include "Map.h"
#include <iostream>
#include <string>
#include <map>
using namespace std;

int main(void)
{
    Map<int,string> strs_M;
    strs_M[4] = "four";
    strs_M[3] = "three";
    strs_M[5] = "five";
    strs_M[7] = "seven";
    strs_M[2] = "two";
    strs_M[1] = "one";
    strs_M[0] = "zero";
    for(Map<int,string>::iterator it = strs_M.begin();
        it != strs_M.end();++it)
        cout<<it->first<<" "<<it->second<<endl;
    cout<<"==============================================="<<endl;
    map<int,string> strs_m;
    strs_m[4] = "four";
    strs_m[3] = "three";
    strs_m[5] = "five";
    strs_m[7] = "seven";
    strs_m[2] = "two";
    strs_m[1] = "one";
    strs_m[0] = "zero";
    for(map<int,string>::iterator it = strs_m.begin();
        it != strs_m.end();++it)
        cout<<it->first<<" "<<it->second<<endl;
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值