zoukankan      html  css  js  c++  java
  • C++ STL 知识小结

    qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多。

    简介

    (来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。

    声明

    每一个大标题下的某个容器,其名称和头文件相同。如queue/priority_queue的头文件是queue。

    vector

    vector可以理解一个不定长数组,内部基于倍增思想实现,在我们设置vector的时候,它申请的内存空间往往是我们设置的2倍,所以使用的时候要谨慎,爆空间就危险了。vector支持随机访问,就像数组一样,但不支持像链表一样O(1)插入,一般是在末尾增删。

    操作函数:

    size:返回此数组的实际长度。

    empty:判断是否为空,为空则返回true。

    (所有的STL容器都支持这两个方法,含义也相同)

    clear:将vector清空。

    迭代器声明:vector<int>::iterator

    begin/end:指向vector中第一个/最后一个元素的迭代器。星号*则可解除引用。和指针的用法类似。

    front/back:返回vector的第一个元素或最后一个元素。等价于*a.begin()/a[0]或*--a.end()/a[a.size()-1]。

    push_back(x):将x插入到vector中成为最后一个元素。

    pop_back:删除vector的最后一个元素。

    vector的用处很多,比较经典常用的就是代替前向星存储树和图等结构。

    queue

    queue下主要包括了循环队列queue和优先队列priority_queue这两种操作。

    循环队列queue

    push(x):将x插入队尾,O(1)操作。

    pop:将队头的元素出队。

    front/back:O(1)访问队头/队尾元素。

    循环队列可用于优化最短路算法,适用SPFA和Dijkstra。

    优先队列priority_queue

    可以把优先队列理解成一个大根二叉堆。

    push(x):把元素x插入堆中。

    pop:删除堆顶元素。

    top:查询堆顶元素,也就是队列中的最大值。

    小根堆priority_queue

    每次我们插入一个元素,把这个元素的相反数插入优先队列中。这样一来,绝对值小的反而在堆顶,用一种巧妙的方法来实现小根堆。

    deque

    双端队列deque是一个支持在队列头尾入队/出队的很妙的结构,基本上所有操作都是神仙O(1)。

    front/back:访问队头/队尾元素。

    push_back(x)/push_front(x):从队尾/队头入队x。

    pop_back/pop/front:删除队头/队尾元素。

    clear:清空队列。deque除了这个操作是O(n)其他都是O(1)。

    begin/end:返回首部/尾部迭代器。

    []:deque可以像vector或者普通数组一样支持下标随机访问,仍然是O(1)。

    set

    顾名思义是集合。set下主要包含了set和multiset两个容器。分别是有序集合和有序多重集合。也就是说set的元素不能重复,但multiset是支持的,其内部实现是一棵红黑树,支持的操作基本相同。

    size/empty/clear:和vector类似。

    迭代器:声明为set<int>::iterator it,它们的迭代器称为双向访问迭代器,不支持随机访问qwq,支持*解除引用,支持++和--,由于内部是红黑树实现,可想而知复杂度是logn。

    begin/end:返回首尾元素的迭代器,begin是最小的元素,根据有序可以看出来。但由于是前闭后开且从零开始,--a.end()最后才会返回最后一个元素的地址。

    insert(x):把一个元素x插入到集合当中,时间复杂度是logn,因为要维护有序。

    insert的一个演示。

    #include<cstdio>
    #include<set>
    using namespace std;
    set<int>s;
    int main()
    {
        s.insert(2);
        s.insert(1);
        for(set<int>::iterator it=s.begin();it!=s.end();it++)
        printf("%d ",*it);
        return 0;  
    }

    find(x):在set中寻找x这个元素并且返回它的迭代器,若没有则返回end()。

    lower_bound(x):查找>=x的元素中最小的一个,并返回它的迭代器。

    upper_bound(x):查找>x的元素中最小的一个,并返回它的迭代器。

    erase(x):若x的类型是迭代器,那么就会删除迭代器所指向的元素,若x指的是元素,就会删除集合中所有等于x的元素(前提是multiset)。

    count(x):返回元素x的个数,复杂度是O(k+logn),k为元素x的个数,上同。(适用于multiset)

    红黑树是平衡树的一种实现方式,感兴趣的同学可以学一学平衡树。

    map

    map容器是一个键值对key-value的映射。内部是一棵以key为关键字的红黑树。key和value都可以是任意类型。

    声明:map<key_type,value_type>

    map容器建立复杂信息key(如字符串)到简单信息value的映射。

    size/empty/clear/begin/end:与set类似,分别为元素个数,判空,清除,开始,结束。

     insert:表示插入。插入方式的表示:

      a.insert(pair<int,string>(2,"bbb"));//第一种插入方式 
        a.insert(pair<int,string>(2,"222"));//不会覆盖 
        a.insert(map<int, string>::value_type (1,"aaa"));//第二种插入方式   
        a.insert(map<int, string>::value_type (1,"111"));//不会覆盖 
        a[3]="ccc";//第三种插入方式 
        a[3]="333";//会覆盖    
    map<string,int>s;
    s.insert(make_pair("August",8));
    s.insert(make_pair("July",7));
    map<string,int>::iterator it=s.begin();
    pair<string,int> p=*it;
    cout<<p.first<<" "<<p.second<<endl;
    it++;
    cout<<s["August"];
    return 0;

    count(x):返回指定元素x出现的次数。当然,x应该是value。

    lower_bound(x)/upper_bound(x):返回>=/>x的第一个元素。

    find(x):查找某个元素是否存在,若不存在则返回尾部迭代器。

    erase(x):删除某个元素。

    []:[]操作符的下标存储的是key,本身存储的是value。

    bitset

    bitset可以看成一个多位二进制数,每八位占一个字节,n位bitset执行一次位运算的复杂度视为n/32。

    声明:bitset<10000>s,申请一个10000位的二进制数。

    ~s:返回对s取反的结果。

    &,|,^:返回对两个数位相同的bitset进行按位与、或、异或运算的结果。

    >>,<<:返回对一个bitset右移,左移若干位的结果。

    ==,!=:比较两个bitset代表的二进制数是否相等。

    []:s[k]表示s的第k位,当然可以用来取值赋值。

    count:判断有多少位位1。

    any:有任意位为1都返回true,若没有任何1则返回false。

    none:有任意位为1都返回false,若没有任何1则返回true。

    set:把所有位变为1。

    set(k,v):把第k位变为v。

    reset:把所有位变为0。

    reset(k):把第k位变为0。

    flip:把所有位取反。

    flip(k):把第k位取反。

    总结

    STL里面的大多结构都能手写(你要是会写红黑树 STL对你来说就基本没用了),但是很多时候考场上我们没有时间去写一些复杂的结构,所以STL成了非常黑科技的代替,但是要慎用,因为STL各种容器的复杂度很玄学,除非你有绝对的把握,不要瞎搞。qwq

  • 相关阅读:
    SpringBoot入门学习(二)
    SpringBoot入门学习(一)
    eclipse调试程序界面简单介绍使用
    利用URLConnection来发送POST和GET请求
    查看用户所属的组
    linux下创建用户,给用户设置密码,给用户授权
    新linux系统上rz 与sz命令不可用
    pom.xml文件报错:web.xml is missing and <failOnMissingWebXml> is set to true
    MySql采用GROUP_CONCAT合并多条数据显示的方法
    Mysql计算时间差
  • 原文地址:https://www.cnblogs.com/valentino/p/11721033.html
Copyright © 2011-2022 走看看