C++STL set和map

关联式容器set

Set作为一个容器是用来存储同一类型数据,在set中每个元素值都唯一,且系统能根据元素的值自动进行排序。内部实现红黑树。

定义使用:

set<int> s;  

s.insert(1);  

s.insert(2);  

s.insert(1);

set源码

//默认升序排列

template <class _Key, class _Compare __STL_DEPENDENT_DEFAULT_TMPL(less<_Key>),

          class _Alloc = __STL_DEFAULT_ALLOCATOR(_Key) >

class set;

template <class _Key, class _Compare, class _Alloc>

inline bool operator==(const set<_Key,_Compare,_Alloc>& __x,

                       const set<_Key,_Compare,_Alloc>& __y);

template <class _Key, class _Compare, class _Alloc>

inline bool operator<(const set<_Key,_Compare,_Alloc>& __x,

                      const set<_Key,_Compare,_Alloc>& __y);

template <class _Key, class _Compare, class _Alloc>

class set {

  // requirements:

  __STL_CLASS_REQUIRES(_Key, _Assignable);

  __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key);

public:

  // typedefs:

  typedef _Key     key_type;

  typedef _Key     value_type;

  typedef _Compare key_compare;

  typedef _Compare value_compare;

private:

  typedef _Rb_tree<key_type, value_type,

                  _Identity<value_type>, key_compare, _Alloc> _Rep_type;

//红黑树实现

  _Rep_type _M_t;  // red-black tree representing set

public:

  // allocation/deallocation

  set() : _M_t(_Compare(), allocator_type()) {}

  explicit set(const _Compare& __comp,

               const allocator_type& __a = allocator_type())

    : _M_t(__comp, __a) {}

  set(const value_type* __first,

      const value_type* __last, const _Compare& __comp,

      const allocator_type& __a = allocator_type())

    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }

#endif /* __STL_MEMBER_TEMPLATES */

  set(const set<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}

  set<_Key,_Compare,_Alloc>& operator=(const set<_Key, _Compare, _Alloc>& __x)

  {

    _M_t = __x._M_t;

    return *this;

  }

  // accessors:

//返回红黑树的begin和end实现

  iterator begin() const { return _M_t.begin(); }

  iterator end() const { return _M_t.end(); }

  bool empty() const { return _M_t.empty(); }

  size_type size() const { return _M_t.size(); }

  size_type max_size() const { return _M_t.max_size(); }

  void swap(set<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }

//调用红黑树的去除重复值插入函数

  // insert/erase

  pair<iterator,bool> insert(const value_type& __x) {

    pair<typename _Rep_type::iterator, bool> __p = _M_t.insert_unique(__x);

    return pair<iterator, bool>(__p.first, __p.second);

  }

  iterator insert(iterator __position, const value_type& __x) {

    typedef typename _Rep_type::iterator _Rep_iterator;

    return _M_t.insert_unique((_Rep_iterator&)__position, __x);

  }

  void erase(iterator __position) {

    typedef typename _Rep_type::iterator _Rep_iterator;

    _M_t.erase((_Rep_iterator&)__position);

  }

  size_type erase(const key_type& __x) {

    return _M_t.erase(__x);

  }

  void clear() { _M_t.clear(); }

  // set operations:

  iterator find(const key_type& __x) const { return _M_t.find(__x); }

  size_type count(const key_type& __x) const {

    return _M_t.find(__x) == _M_t.end() ? 0 : 1;

  }

  iterator lower_bound(const key_type& __x) const {

    return _M_t.lower_bound(__x);

  }

  iterator upper_bound(const key_type& __x) const {

    return _M_t.upper_bound(__x);

  }

  pair<iterator,iterator> equal_range(const key_type& __x) const {

    return _M_t.equal_range(__x);

  }

};

template <class _Key, class _Compare, class _Alloc>

inline bool operator==(const set<_Key,_Compare,_Alloc>& __x,

                       const set<_Key,_Compare,_Alloc>& __y) {

  return __x._M_t == __y._M_t;

}

template <class _Key, class _Compare, class _Alloc>

inline bool operator<(const set<_Key,_Compare,_Alloc>& __x,

                      const set<_Key,_Compare,_Alloc>& __y) {

  return __x._M_t < __y._M_t;

}

Multiset的特性和用法和set完全相同,唯一区别是multiset支持存储多个相同的元素。

multiset源码实现

template <class _Key, class _Compare __STL_DEPENDENT_DEFAULT_TMPL(less<_Key>),

          class _Alloc = __STL_DEFAULT_ALLOCATOR(_Key) >

class multiset;

template <class _Key, class _Compare, class _Alloc>

class multiset {

  // requirements:

public:

  // typedefs:

private:

  typedef _Rb_tree<key_type, value_type,

                  _Identity<value_type>, key_compare, _Alloc> _Rep_type;

//红黑树实现

  _Rep_type _M_t;  // red-black tree representing multiset

public:

  // allocation/deallocation

  multiset() : _M_t(_Compare(), allocator_type()) {}

  explicit multiset(const _Compare& __comp,

                    const allocator_type& __a = allocator_type())

    : _M_t(__comp, __a) {}

//multiset的插入函数调用的是红黑树的可以插入相同元素的函数

  // insert/erase

  iterator insert(const value_type& __x) {

    return _M_t.insert_equal(__x);

  }

  iterator insert(iterator __position, const value_type& __x) {

    typedef typename _Rep_type::iterator _Rep_iterator;

    return _M_t.insert_equal((_Rep_iterator&)__position, __x);

  }

  void erase(iterator __position) {

    typedef typename _Rep_type::iterator _Rep_iterator;

    _M_t.erase((_Rep_iterator&)__position);

  }

  size_type erase(const key_type& __x) {

    return _M_t.erase(__x);

  }

  void erase(iterator __first, iterator __last) {

    typedef typename _Rep_type::iterator _Rep_iterator;

    _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last);

  }

  void clear() { _M_t.clear(); }

  // multiset operations:

  iterator find(const key_type& __x) const { return _M_t.find(__x); }

  size_type count(const key_type& __x) const { return _M_t.count(__x); }

  iterator lower_bound(const key_type& __x) const {

    return _M_t.lower_bound(__x);

  }

  iterator upper_bound(const key_type& __x) const {

    return _M_t.upper_bound(__x);

  }

  pair<iterator,iterator> equal_range(const key_type& __x) const {

    return _M_t.equal_range(__x);

  }

};

Map

Map提供一对一的数据处理能力,第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值,默认按照key进行排序,内部实现红黑树。

Map使用:

map<int, string> mapStudent;

mapStudent.insert(pair<int, string>(1, "student_one"));

mapStudent.insert(pair<int, string>(2, "student_two"));

mapStudent.insert(map<int, string>::value_type (1, "student_one")); 

mapStudent.insert(map<int, string>::value_type (2, "student_two"));

判断插入是否成功

pair<map<int, string>::iterator, bool> Insert_Pair;

Insert_Pair = mapStudent.insert(pair<int, string>(1, "student_one"));

if(Insert_Pair.second == true) //success

map源码

//默认升序

template <class _Key, class _Tp,

          class _Compare __STL_DEPENDENT_DEFAULT_TMPL(less<_Key>),

          class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >

class map;

//key键值,Tp数据类型

template <class _Key, class _Tp, class _Compare, class _Alloc>

class map {

public:

// requirements:

  __STL_CLASS_REQUIRES(_Tp, _Assignable);

  __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Key, _Key);

// typedefs:

  typedef _Key                  key_type;

  typedef _Tp                   data_type;

  typedef _Tp                   mapped_type;

  typedef pair<const _Key, _Tp> value_type;

  typedef _Compare              key_compare;

    

  class value_compare

    : public binary_function<value_type, value_type, bool> {

  friend class map<_Key,_Tp,_Compare,_Alloc>;

private:

  typedef _Rb_tree<key_type, value_type,

                   _Select1st<value_type>, key_compare, _Alloc> _Rep_type;

//红黑树

  _Rep_type _M_t;  // red-black tree representing map

public:

  // allocation/deallocation

  map() : _M_t(_Compare(), allocator_type()) {}

  explicit map(const _Compare& __comp,

               const allocator_type& __a = allocator_type())

    : _M_t(__comp, __a) {}

  map(const map<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}

  map<_Key,_Tp,_Compare,_Alloc>&

  operator=(const map<_Key, _Tp, _Compare, _Alloc>& __x)

  {

    _M_t = __x._M_t;

    return *this;

  }

  // accessors:

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

  const_iterator begin() const { return _M_t.begin(); }

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

  const_iterator end() const { return _M_t.end(); }

  bool empty() const { return _M_t.empty(); }

  size_type size() const { return _M_t.size(); }

  size_type max_size() const { return _M_t.max_size(); }

  

  void swap(map<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }

  // insert/erase

//insert为红黑树的insert_unique函数,不允许重复

  pair<iterator,bool> insert(const value_type& __x)

    { return _M_t.insert_unique(__x); }

  iterator insert(iterator position, const value_type& __x)

    { return _M_t.insert_unique(position, __x); }

  void erase(iterator __position) { _M_t.erase(__position); }

  size_type erase(const key_type& __x) { return _M_t.erase(__x); }

  void erase(iterator __first, iterator __last)

    { _M_t.erase(__first, __last); }

  void clear() { _M_t.clear(); }

  // map operations:

  iterator find(const key_type& __x) { return _M_t.find(__x); }

  const_iterator find(const key_type& __x) const { return _M_t.find(__x); }

  size_type count(const key_type& __x) const {

    return _M_t.find(__x) == _M_t.end() ? 0 : 1;

  }

  iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }

  const_iterator lower_bound(const key_type& __x) const {

    return _M_t.lower_bound(__x);

  }

  iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }

  const_iterator upper_bound(const key_type& __x) const {

    return _M_t.upper_bound(__x);

  }

  

  pair<iterator,iterator> equal_range(const key_type& __x) {

    return _M_t.equal_range(__x);

  }

  pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {

    return _M_t.equal_range(__x);

  }

};

Multimap源码

template <class _Key, class _Tp,

          class _Compare __STL_DEPENDENT_DEFAULT_TMPL(less<_Key>),

          class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >

class multimap;

template <class _Key, class _Tp, class _Compare, class _Alloc>

class multimap {

  // requirements:

public:

// typedefs:

  typedef _Key                  key_type;

  typedef _Tp                   data_type;

  typedef _Tp                   mapped_type;

  typedef pair<const _Key, _Tp> value_type;

  typedef _Compare              key_compare;

  class value_compare : public binary_function<value_type, value_type, bool> {

  friend class multimap<_Key,_Tp,_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);

    }

  };

private:

  typedef _Rb_tree<key_type, value_type,

                  _Select1st<value_type>, key_compare, _Alloc> _Rep_type;

  _Rep_type _M_t;  // red-black tree representing multimap

public:

// allocation/deallocation

  multimap() : _M_t(_Compare(), allocator_type()) { }

  explicit multimap(const _Compare& __comp,

                    const allocator_type& __a = allocator_type())

    : _M_t(__comp, __a) { }

  multimap(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) { }

  multimap<_Key,_Tp,_Compare,_Alloc>&

  operator=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) {

    _M_t = __x._M_t;

    return *this;

  }

  // accessors:

  key_compare key_comp() const { return _M_t.key_comp(); }

  value_compare value_comp() const { return value_compare(_M_t.key_comp()); }

  allocator_type get_allocator() const { return _M_t.get_allocator(); }

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

  const_iterator begin() const { return _M_t.begin(); }

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

  const_iterator end() const { return _M_t.end(); }

  

  bool empty() const { return _M_t.empty(); }

  size_type size() const { return _M_t.size(); }

  size_type max_size() const { return _M_t.max_size(); }

  void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }

  // insert/erase

  iterator insert(const value_type& __x) { return _M_t.insert_equal(__x); }

  iterator insert(iterator __position, const value_type& __x) {

    return _M_t.insert_equal(__position, __x);

  }

  void erase(iterator __position) { _M_t.erase(__position); }

  size_type erase(const key_type& __x) { return _M_t.erase(__x); }

  void erase(iterator __first, iterator __last)

    { _M_t.erase(__first, __last); }

  void clear() { _M_t.clear(); }

  // multimap operations:

  iterator find(const key_type& __x) { return _M_t.find(__x); }

  const_iterator find(const key_type& __x) const { return _M_t.find(__x); }

  size_type count(const key_type& __x) const { return _M_t.count(__x); }

  iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }

  const_iterator lower_bound(const key_type& __x) const {

    return _M_t.lower_bound(__x);

  }

  iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }

  const_iterator upper_bound(const key_type& __x) const {

    return _M_t.upper_bound(__x);

  }

   pair<iterator,iterator> equal_range(const key_type& __x) {

    return _M_t.equal_range(__x);

  }

  pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {

    return _M_t.equal_range(__x);

  }

};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值