【数据结构】关联式容器map和set的模拟实现

实现

  • map
  • set
  • 写一个测试

红黑树模拟实现.

map

主要的问题就在map的[]operator重载:
map的[]重载.

//map的实现
template<class K, class T>
class Map{
     

	struct MapKeyOfValue{
     
		const K& operator()(const pair<K, T>& val){
     
			return val.first;
		}
	};

public:
	typedef typename RBTree<K, pair<K, T>, MapKeyOfValue>::iterator iterator;

	//封装insert接口
	pair<iterator, bool> insert(const pair<K, T>& kv){
     
		return _rbt.insert(kv);
	}

	iterator begin(){
     
		return _rbt.begin();
	}

	iterator end(){
     
		return _rbt.end();
	}

	iterator rbegin(){
     
		return _rbt.rbegin();
	}

	//map的[]重载,返回pair的second的值
	T& operator[](const K& key){
     
		pair<iterator, bool> ret = _rbt.insert(make_pair(key, T()));
		return ret.first->second;
	}

private:
	typedef RBTree<K, pair<K, T>, MapKeyOfValue> rbt;
	rbt _rbt;
};

set

template<class K>
class Set{
     

	struct SetKeyOfValue{
     
		const K& operator()(const K& val){
     
			return val;
		}
	};

public:
	typedef typename RBTree<K, K, SetKeyOfValue>::iterator iterator;

	//封装insert接口
	pair<iterator, bool> insert(const K& k){
     
		return _rbt.insert(k);
	}

	iterator begin(){
     
		return _rbt.begin();
	}

	iterator end(){
     
		return _rbt.end();
	}

	iterator rbegin(){
     
		return _rbt.rbegin();
	}

private:
	typedef RBTree<K, K, SetKeyOfValue> rbt;
	rbt _rbt;
};

写一个测试

Map<int, int> m;
	m.insert(make_pair(5, 5));
	m.insert(make_pair(3, 5));
	m.insert(make_pair(2, 5));
	m.insert(make_pair(1, 5));
	m.insert(make_pair(4, 5));
	m.insert(make_pair(4, 5));
	Map<int, int>::iterator it = m.begin();
	while (it != m.end()){
     
		cout << it->first << " " << it->second << endl;
		++it;
	}

【数据结构】关联式容器map和set的模拟实现_第1张图片

你可能感兴趣的:(数据结构,封装)