STL容器 map 与 set 的用法

认识pair

在介绍容器之前,我们先来介绍一下pair,pair是一种结构体模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在 #include< uitility >中。在set map中使用pair的原因是让他们可以底层封装公用同一棵红黑树。

定义在 uitility文件中的pair 结构体模板部分代码。

template<class _Ty1,
    class _Ty2>
    struct pair
    {   // store a pair of values
    typedef pair<_Ty1, _Ty2> _Myt;
    typedef _Ty1 first_type;
    typedef _Ty2 second_type;

    pair()
        : first(), second()
        {   // default construct
        }

    pair(const _Ty1& _Val1, const _Ty2& _Val2)
        : first(_Val1), second(_Val2)
        {   // construct from specified values
        }
    _Ty1 first; // the first stored value
    _Ty2 second;    // the second stored value
    };

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

关于set

set是一种key结构,它的元素就是它的键值,set不允许有两个相同的键值,set中的所有元素的键值都会自动被排序。set和multiset都包含在#include中。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是元素的类型在set中value_type 就是键值key,他会返回一个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
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,itertor last)
删除一段迭代器区间。

void TestSet2()
{
    //测试insert()
    set<int> Myset3;
    for (int i = 0; i < 5; ++i){
        Myset3.insert(i * 10);
    }
    set<int>::iterator it3;
    pair<set<int>::iterator, bool> ret = Myset3.insert(20);
    if (ret.second == false){
  //insert()函数的返回值是pair<> pair<>的第一个模板参数记录插入位置或插入失败 
        it3 = ret.first;     //位置的迭代器    第二个参数表示是否插入成功。
        cout <<"插入失败"<< *it3 << endl;
    }
    int brr[] = { 1, 2, 3, 4 };
    Myset3.insert(brr, brr + 4);//可以按区间插入
    it3 = Myset3.begin();
    while (it3 != Myset3.end()){
        cout << *it3++ << " ";
    }
    cout << endl;
    //测试删除操作
    Myset3.erase(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值