set与map用法简介

59 篇文章 8 订阅
35 篇文章 2 订阅
   在介绍容器之前,我们先来介绍一下pair,pair是一种模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在#include<utility> 中。

可以看到,pair的两个成员分别是first和second。

一、set(集合):
    set是一种key结构,它的元素就是它的键值,set不允许有两个相同的键值,set中的所有元素的键值都会自动被排序。set和multiset都包含在#include<set>中。set和multiset的底层都是用红黑树实现的,不过set的底层插入机制是insert_unique,multiset的底层插入机制是insert_equal。

    template<class Key,class Compare=less<Key>,class Allocator<Key> >
    set也是一种模板,它的第一个模板参数是键值的类型。第二个参数是一个仿函数,它传入了键值的比较方式,决定是升序排序还是降序排序。第三个参数是空间配置器。

set的常用操作:
1、insert
  1.1、pair<iterator,bool> insert(const value_type& x)
    其中value_type是键值的类型,他会返回一个pair类型的对象,其中pair的second如果为true的话就表示插入成功,否则就表示元素已经存在。
    first是一个指向要插入位置的迭代器。如果second是false,则frist就是已经存在的元素的这个位置的迭代器,如果second为true,first就是插入位置的迭代器。

  1.2、iterator insert(iterator position,const valut_type& val)
    position是一个迭代器的位置,val表示要插入的数。如果插入成功,则会返回一个新插入元素位置的迭代器。否则的话返回这个传入的迭代器。

  1.3、template<class InputIterator>
    void insert(InputIterator first,InputIterator last)
    插入一段迭代器区间

2、erase
  2.1、void erase(iterator position)
    删除一个迭代器位置。

  2.2、size_type erase(const value_type& val)
    如果删除成功的话就返回1,否则返回0。

  2.3、void erase(iterator first,iterator last)
    删除一段迭代器区间。

3、find
   iterator find(const value_type& val) const;
   如果找到的话就返回这个位置的迭代器,否则就返回end。

4、count
   size_type count(const value_type& val) const;
   统计键值出现的次数,由于set里面不允许有重复出现的键值,所以count的返回结果就只有0和1两个结果,0就表示不存在,1表示存在。有木有感觉set中的count与empty的功能重复了,其实count在multiset中的作用比较大,但是为了统一STL中容器的接口,所以在set中也增加了count。

set的迭代器set::iterator是一种const_iterator,所以不允许通过迭代器修改set中的值。

multiset:
     multiset的特性和用法和set的用法完全相同,唯一的差别就是它允许键值重复出现。下面可以下他们的不同之处:
1、insert
    iterator insert(const value_type& val)如果直接插入一个键值的话,在multiset中返回的是插入元素位置的迭代器。

2、count
    multiset中可以出现重复的键值。count统计的是相同键值出现的次数。如果count的结果为0则表示没有出现,如果不为0则表示出现的次数 。


二、map(映射):
   map是一种Key(键)、value(值)形式,用于保存键和值组成的条目集合。它要求键值必须是唯一的,值可以不唯一,同一个值可以映射到多个键上。所有的元素都会根据键值自动排序。map中的所有元素都是pair,同时拥有键值(Key)和实值(value),pair的first被视为键值,second被当做实值,但不允许有相同的键值。map的底层是用红黑树实现的,它的insert机制是一种insert_unique()。我们不可以通过迭代器修改元素的键值,但是可以通过迭代器修改元素的实值。

template<class Key,class T,class Compare=less<Key>,class Alloc=allocator<pair<const Key,T> > >
  map也是一个模板,他有四个模板参数类型,第一个是键值的类型。第二个是实值的类型。第三个是一个仿函数,它传入的是键值的比较方式,默认是升序排列。第四个是空间配置器。

map的每个元素都是pair类型。
typedef pair<K,V> value_type;

1、insert
  1.1、pair<iterator,bool> insert(const value_type& val);
   插入一个value_type类型,返回值是一个pair类型。   pair<iterator,bool>=pair<map<K,V>::iterator,bool>。如果插入成功的话则bool就为true,且iterator指向插入的位置,否则的话iterator就指向已经存在的这个元素的位置。iterator是一个pair<K,V>类型的迭代器。


  1.2、iterator insert(iterator,const value_type& val)
    在一个迭代器的位置插入一个value_type类型的数据,如果插入成功的话返回这个成功位置的迭代器,如果失败的话则返回这个传入的迭代器。

  1.3、template<class InputIterator>
    void insert(InputIterator first,InputIterator last);
    插入一段迭代器区间

2、erase
  2.1、void erase(iterator position)
    删除一个这个迭代器位置的元素。

  2.2、size_type erase(const key_type& k)
    删除这个键值所在的位置,成功返回1,失败返回0

  2.3、void erase(iterator first,iterator last);
    删除一段迭代器区间。

3、find
    iterator find(const key_type& k)
    如果查找成功的话则返回这个元素的迭代器,否则返回end,所以在使用find返回的迭代器之前要先判断一下。

4、count
    size_type count(const key_type& k)const
    map中的count与set的count功能一样。

5、operator[]
    mapped_type& operator[](const key_type& k)
    map中的operator[]是最常用的,如果map中有这个k,则它就把这个k所对应的value的引用返回。如果map中没有这个k的话,则它会调用insert(pair<K,V>(k,V())),将k和V的缺省值对应起来插入进去,并返回这个value的引用。

multimap:
    multimap与map的特性及用法完全相同,唯一的差别是multimap允许键值重复。multimap包含在#include<map>中,它的底层是用红黑树实现的,它的insert机制是insert_equal。它的count与multiset的count的用法及作用完全一样。下面看一下他们的不同:
1、insert
   iterator insert(const value_type& val)
   如果插入一个map的元素的话,multimap会返回一个这个插入位置的迭代器。
2、count
   count与multiset的count完全相同,multimap中的count统计的是键值出现的次数。

3、multimap中没有operator[],这个很好理解,当你调用operator[]的时候会对应多个结果,返回哪个都不合适,所以也就没有operator[]。







  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值