STL之map实现

#ifndef __MAP_H
#define __MAP_H

#include"rbt.h"
#include"pair.h"
#include<functional>
template<class Key,class T,class Compare=less<Key>,class Alloc=alloc>
class map
{
public:
	typedef Key key_type;
	typedef T data_type;
	typedef T mapped_type;
	typedef __pair<Key, T> value_type;
	typedef Compare key_compare;

	class value_compare :public std::binary_function<value_type, value_type, bool>
	{
		friend class map<Key, T, Compare, Alloc>;
	protected:
		Compare comp;
		value_compare(Compare c) :comp(c){}
	public:
		bool operator()(const value_type& x, const value_type& y)const
		{
			return comp(x.first, y.first);
		}
	};

protected:
	typedef rb_tree < key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;
	rep_type t;
public:
	typedef typename rep_type::pointer pointer;
	typedef typename rep_type::const_pointer const_pointer;
	typedef typename rep_type::reference reference;
	typedef typename rep_type::const_reference const_reference;
	typedef typename rep_type::iterator iterator;
	typedef typename rep_type::const_iterator const_iterator;
	typedef typename rep_type::size_type size_type;
	typedef typename rep_type::difference_type difference_type;

	map() :t(Compare()){}
	explicit map(const Compare& comp) :t(comp){}
	template<class InputIterator>
	map(InputIterator first, InputIterator last) : t(Compare())
	{
		t.insert_unique(first, last);
	}
	template<class InputIterator>
	map(InputIterator first, InputIterator last, const Compare& comp) : t(comp)
	{
		t.insert_unique(first, last);
	}
	map(const map<Key, T, Compare, Alloc>& x) :t(x.t){}
	map<Key, T, Compare, Alloc>& operator=(const map<Key, T, Compare, Alloc>& x)
	{
		t = x.t;
		return *this;
	}

	key_compare key_comp()const{ return t.key_comp(); }
	value_compare value_comp()const{ return value_compare(t.key_comp()); }
	iterator begin(){ return t.begin(); }
	iterator end(){ return t.end(); }
	bool empty()const { return t.empty(); }
	size_type size()const{ return t.size(); }
	size_type max_size()const{ return t.max_size(); }
	T& operator[](const key_type& k)
	{
		return (*((insert(value_type(k, T()))).first)).second;
	}
	__pair<iterator, bool> insert(const value_type& x)
	{
		return t.insert_unique(x);
	}
	template<class InputIterator>
	void insert(InputIterator first, InputIterator last)
	{
		t.insert_unique(first, last);
	}
	void erase(iterator position){ t.erase(position); }
	size_type erase(const key_type& x){ return t.erase(x); }
	void erase(iterator first, iterator last){ t.erase(first, last); }
	void clear(){ t.clear(); }
	iterator find(const key_type& x){ return t.find(x); }
	iterator lower_bound(const key_type& x){ return t.lower_bound(x); }
	iterator upper_bound(const key_type& x){ return t.upper_bound(x); }
	__pair<iterator, iterator> equal_range(const key_type& x)
	{
		return t.equal_range(x);
	}
	friend bool operator==(const map&, const map&);
	friend bool operator<(const map&, const map&);
};

template<class Key, class T, class Compare,class Alloc>
inline bool operator==(const map<Key, T, Compare, Alloc>& x, const map<Key, T, Compare, Alloc>& y)
{
	return x.t == y.t;
}

template<class Key,class T,class Compare,class Alloc>
inline bool operator<(const map<Key, T, Compare, Alloc>& x, map<Key, T, Compare, Alloc>& y)
{
	return x.t < y.t;
}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值