码迷,mamicode.com
首页 > 其他好文 > 详细

(五)STL剖析——set、map

时间:2016-08-12 21:46:27      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:set、map

简单了解了set、map的框架和接口


set

//所有元素都会根据键值进行排序,set不允许有两个相同的键值
//不能通过迭代器对set的元素进行修改,set的键值即实值,实值即键值,底层为const
//set使用红黑树的insert_unique(),mutilset才能使用insert_equal()
//关联式容器进行查找时最好使用其自己提供的find,而不是STL算法find

template<class T1, class T2>
struct Pair
{
	T1 first;
	T2 second;
	Pair()
		:first(T1())
		, second(T2())
	{}
	Pair(const T1& a, const T2& b)
		:first = a
		, second = b
	{}
};
template<class K,class Compare=Less<K>,class Alloc=alloc>//缺省采用递增排序
class Set
{
private:
	template<class T>
	struct Identity :public UnaryFunction<T, T>//unary_function<T, T>定义于<stl_function.h>
	{
		const T& operator(const T& x)const
		return x;
	};
	typedef RBTree<K, V, Identity<V>, Compare, Alloc> RepType;
	RepType t;//用红黑树来表示set
public:
	typedef typename RepType::ConstIterator Iterator;//表示无法通过set的迭代器进行修改
	typedef K ValueType;
public:
	Iterator Begin();
	Iterator End();
	void Clear();
	bool Empty()const;
	size_t Count(const K& key);
	size_t Size()const;
	void Swap(Set<K,Compare,Alloc>& s);

	Pair<Iterator,bool> Insert(const K& key);
	Iterator Insert(Iterator pos,const K& key);
	template<class InputIterator>
	void Insert(InputIterator first,Iterator last);

	size_t Erase(const K& key);
	void Erase(Iterator pos);
	void Erase(Iterator first,Iterator last);

	Iterator Find(const K& key)const;
};

Map

//map的所有元素都是pair,pair的第一元素称为键值,第二元素称为实值
//map会根据其键值进行排序,不允许两个相同的键值
//map不可以通过迭代器修改其键值,但可以修改其实值

template<class T1,class T2>
struct Pair
{
	T1 first;
	T2 second;
	Pair()
		:first(T1())
		, second(T2())
	{}
	Pair(const T1& a, const T2& b)
		:first = a
		,second = b
	{}
};
template<class K,class T, class Compare = Less<K>, class Alloc = alloc>//缺省采用递增排序
class Map
{
private:
	typedef RBTree<K, V, Selectlst<V>, Compare, Alloc> RepType;
	RepType t;//以红黑树表现Map

	typedef Map<K, T, Compare, Alloc> Self;
public:
	typedef Pair<const K, T> ValueType;
	typedef typename RepType::Iterator Iterator;//它不像Set一样将迭代器定义为ConstIterator
public:
	Iterator Begin();
	Iterator End();
	size_t Count(const T& x)const;
	bool Empty()const;
	size_t Size()const;
	void Swap(Self& m);
	void Clear();

	Pair<Iterator, bool> Insert(const ValueType& value);
	Iterator Insert(Iterator pos,const ValueType& value);//Position of the first element to be compared for the insertion operation.
	template<class InputIterator>
	void Insert(InputIterator first, InputIterator last);
	
	size_t Erase(const K& key);
	void Erase(Iterator pos);
	void Erase(Iterator first, Iterator last);
	
	Iterator Find(const K& key);
	
	T& operator[](const K& key)
	{
		return ((*(Insert(ValueType(key, T()))).first).second);
	}
};


本文出自 “零蛋蛋” 博客,谢绝转载!

(五)STL剖析——set、map

标签:set、map

原文地址:http://lingdandan.blog.51cto.com/10697032/1837435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!