C++STL标准库学习笔记(五)set

目录

前言:

正文

        1.1set的作用

        1.2 set的用法

后记:


前言:

        在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色了。

        在上篇博客的时候就在想multiset去掉multi会是啥,然后就来到了这一节,set。

正文

        1.1set的作用

        set和multiset的区别在于容器内不能有重复元素

        a和b重复等价于“a必须排在b前面”和“b必须排在a前面”都不成立。这都强调多少次了,不过每一次都不一样就是了,这里是重复,之前是相等以及排序。

        set插入元素可能不成功

        使用时同样要注意#include<set>

        1.2 set的用法

        也先给上代码样例:

#include<iostream>
#include<cstring>
#include<set>
using namespace std;

int main(int argc, char const *argv[])
{
    set<int> st;
    int a[10] = {1,2,3,8,7,7,5,6,8,12};
    for (int i = 0; i < 10; i++)
    {
        st.insert(a[i]);
    }
    cout<<st.size()<<endl;//结果:8
    //这里就是set的特色所在了,7和7,8和8重复了,只留下了一个7和一个8
    set<int>::iterator i;
    for ( i = st.begin(); i != st.end(); i++)
    {
        cout<<*i<<",";//结果:1,2,3,5,6,7,8,12,
    }//没有重复元素
    cout<<endl;
    pair<set<int>::iterator,bool>result = st.insert(2);
    //我试了下,这个insert的返回值也是pair类型,first是
    //iterator,second是bool,所以说不能调换位置。
    /*
    pair<set<int>::iterator,bool>
    等价于
    struct
    {
        set<int>::iterator first;
        bool second;
    }
    */
    if (!result.second)//条件成立说明插入不成功
    {//此时first这个迭代器就会指向那个重复的元素
        cout<<*result.first<<" already exists."<<endl;
    }
    else
    {
        cout<<*result.first<<" inserted."<<endl;
    }//结果:2 already exists.
    return 0;
}

        老样子,我们从代码里找出有用的地方来简单介绍。

        1、set的建立:

        set<int> st;

        st.insert(a[i]);

        这个插入就会体现出set的特色了,样例中插入了10个元素,输出st.size()时却只有8的大小,这是因为输入了两个7和两个8,因为重复,所以插入♂不了了。

        2、pair<T1,T2>的使用

        我们在程序中使用了pair<set<int>::iterator,bool>result = st.insert(2);来让result这个pair类型变量接收insert()的返回值,那么pair是什么呢?

        在这个地方:

        pair<set<int>::iterator,bool>

        等价于:

struct
{
    set<int>::iterator first;
    bool second;
}result;

        而:

        pair<T1,T2>类型等价于:

struct 
{
    T1 first;
    T2 second;
};

        例如:pair<int, double>a;

        等价于:

struct 
{
    int first;
    double second;
}a;
a.first = 1;

        最后补充一下:

        刚刚调试了一下发现insert()的返回值是pair类型,其中first是iterator类型,指向已经插入了的那个值的位置,second是bool类型,用于反馈插入是否成功。成功和失败都会用迭代器返回值的位置,成功时second的值为true,失败时为false,可以拿上面样例改个数字进行调试而知道这个结果。顺带一提,first和second调换先后会报错,就是说不能用pair<bool,set<T>::iterator>来接受insert()的返回值。(本来觉得它挺智能的,其实也就那样哈哈哈)

后记:

        这里主要介绍了set和pair的用法,不知道STL标准库还有多少多少东西可以研究(挺有意思的),老师推荐了一本书《C++标准库》,等书到了我就去把一些常用的STL标准库中的东东做成笔记扔进博客。感谢大家读到这里,祝大家青春永驻,byebye~~~。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值