C++ STL源码分析——map和multimap

【侯捷-SL体系结构内核分析-map和multimap探索】
map和multimap底层同样以红黑树_Tree作为支撑,关于红黑树_Tree可以看看我的这篇文章:C++ STL源码分析——set和multiset

_Traits参数

map和multimap的红黑树_Traits参数如下:

template<class _Kty,	// key type
	class _Ty,	// mapped type
	class _Pr,	// comparator predicate type
	class _Alloc,	// actual allocator type (should be value allocator)
	bool _Mfl>	// true if multiple equivalent keys are permitted
	class _Tmap_traits
	{	// traits required to make _Tree behave like a map
public:
	using key_type = _Kty;
	using value_type = pair<const _Kty, _Ty>;
	using key_compare = _Pr;
	using allocator_type = _Alloc;
#if _HAS_CXX17
	using node_type = _Node_handle<
		_Tree_node<value_type, typename allocator_traits<_Alloc>::void_pointer>,
		_Alloc, _Node_handle_map_base, _Kty, _Ty>;
#endif /* _HAS_CXX17 */

	enum
		{	// make multi parameter visible as an enum constant
		_Multi = _Mfl};

	class value_compare
		{	// functor for comparing two element values
	public:
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type first_argument_type;
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef value_type second_argument_type;
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type;

		bool operator()(const value_type& _Left, const value_type& _Right) const
			{	// test if _Left precedes _Right by comparing just keys
			return (comp(_Left.first, _Right.first));
			}

	protected:
		friend _Tree<_Tmap_traits>;

		value_compare(key_compare _Pred)
			: comp(_Pred)
			{	// construct with specified predicate
			}

		key_compare comp;	// the comparator predicate for keys
		};

	template<class _Ty1,
		class _Ty2>
		static const _Kty& _Kfn(const pair<_Ty1, _Ty2>& _Val)
		{	// extract key from element value
		return (_Val.first);
		}
	};

可以看出:

  • map和multimap将传入的key值_Kty和data值_Ty打包成一个pair,将该pair作为红黑树的value_type。
  • pair通过将key值_Kty设置为const,来保证key值不可修改
  • 定义了如何从value中解析出key值的函数_Kfn。

map和multimap

  • map提供[]操作符,通过key值来查找相应的value值。当查找不成功时,会创建新的节点插入其中。也就是说,map除了可以用insert函数插入元素外,还可以通过[]来进行插入操作
  • multimap未重载[]操作符。

你可能感兴趣的:(编程语言,#,C++)