C++中STL相关知识


STL介绍
STL标准模板库,由惠普实验室提供,里面集成了常用的数据结构类模板和算法函数模板等。
容器:用来存储各种类型数据的数据结构。
迭代器:类似于专门用来指向容器成员的指针,用来遍历、操作、管理容器中的成员,可以大大提高容器的访问速度。
算法:STL实现了常见的排序、查找算法。

在这里插入图片描述

List:双端链表容器

iterator:用来指向容器中的元素
    begin() 获取指向第一个元素的迭代器
    end() 获取指向最后一个元素的下一个位置
相关使用参考:https://blog.csdn.net/Ikaros_521/article/details/100091859

在这里插入图片描述

vector:向量容器,俗称数组

    #include <iostream>
    #include <vector>
    using namespace std;

    void show(vector<int>& arr)
    {
        for(int i=0; i<arr.size(); i++)
        {
            cout << arr[i] << " ";
        }
        cout << endl;
    }

    int main()
    {
        // 创建向量,设置容量并初始化
        vector<int> arr(12,0);
        show(arr);

        // 向量支持[]运算符,所以被称为数组
        for(int i=0; i<10; i++)
        {
            arr[i] = i;
        }
        show(arr);

        vector<int> arr1(10,0);    
        // 支持比较运算符
        cout << (arr[0]==arr1[0]) << endl;

        // at成员函数,相当于[]操作
        for(int i=0; i<arr.size(); i++)
        {
            cout << arr.at(i) << " ";
        }
        cout << endl;

        // 获取向量的容量 
        cout << arr.capacity() << endl;
    }

在这里插入图片描述
在这里插入图片描述

stack、queue:栈和队列

在这里插入图片描述

double-ended queues:双端队列,用法与向量基本一致,但可以在头和尾快速插入和删除元素

    #include <iostream>
    #include <deque>
    using namespace std;

    int main()
    {
        deque<int> d(10,0);
        for(int i=0; i<d.size(); i++)
        {
            d[i] = i;
        }

        for(int i=0; i<d.size(); i++)
        {
            cout << d[i] << " ";
        }
        cout << endl;
    }

在这里插入图片描述

set:集合容器,集合中的数据会自动排序,不能重复(赋重复值也没用)。

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

    int main()
    {
        int arr[5] = {4,3,2,2,5};
        set<int> s;
        // 在集合中插入元素
        s.insert(arr,arr+5);
        set<int>::iterator it;
        for(it=s.begin(); it!=s.end(); it++)
        {
            cout << *it << " ";
        }
        // 返回某个值元素的个数
        cout << endl << s.count(2) <<" "<<s.count(1)<< endl;
        // 返回指向大于(或等于)某值的第一个元素的迭代器
        cout << *s.lower_bound(1) << endl;
    }

在这里插入图片描述

map:是一种关联容器,在其他编程语言中叫字典,C++中叫映射,以key/value键值对的方式进行存储,key的值不能重复。

    #include <iostream>
    #include <map>
    using namespace std;

    int main()
    {
        map<int,string> m;
        // 插入元素
        m.insert(make_pair(10010,"hehe"));
        m.insert(make_pair(10011,"haaa"));
        m.insert(make_pair(10012,"xixi"));
        m.insert(make_pair(10013,"ohho"));
        m.insert(make_pair(10013,"ohho"));
        cout << m.size() << endl;
        cout << (*m.find(10011)).second << endl;

        map<int,string>::iterator it;
        for(it=m.begin(); it!=m.end(); it++)
        {
            cout<< (*it).first << " " << (*it).second << endl;
        }
    }

在这里插入图片描述

multimap:多重映射,它与map很像,区别是它的key的值可以重复。

    #include <iostream>
    #include <map>
    using namespace std;

    int main()
    {
        multimap<int,string> mm;
        // 插入元素
        mm.insert(make_pair(10010,"ha1"));
        mm.insert(make_pair(10012,"ha2"));
        mm.insert(make_pair(10010,"ha3"));
        mm.insert(make_pair(10013,"ha4"));
        mm.insert(make_pair(10010,"ha5"));
        cout << mm.size() << endl;
        multimap<int,string>::iterator it;
        // 查找一个元素
        it = mm.find(10010);
        // 返回指定元素出现的次数
        for(int i=0; i<mm.count(10010); i++)
        {
            cout << (*it).second << endl;
            it++;
        }
    }

在这里插入图片描述

multiset:多重集合,它与set很像,区别是它的值可以重复。

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

    int main()
    {
        int arr[10] = {1,3,5,3,2,5,7,6,3,9};
        multiset<int> ms(arr,arr+10);
        cout << ms.size() << endl;
        cout << ms.count(3) << endl;
        multiset<int>::iterator it;
        for(it=ms.begin(); it!=ms.end(); it++)
        {
            cout << (*it) << " ";
        }
    }

在这里插入图片描述

priority_queue:优先队列,它会根据元素的比较结果进行排序。

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <queue>

using namespace std;

int com(int& a,int& b)
{
    if(a > b)
        return 1;
    else if(a < b)
        return -1;
    else
        return 0;
}
int main()
{
    srand(time(NULL));
    priority_queue<int> pq;
    for(int i=0; i<10; i++)
    {
        int val = rand()%100;
        cout << val << " ";
        pq.push(val);
    }
    cout << pq.size() << endl;
    while(!pq.empty())
    {
        cout << pq.top() << " ";
        pq.pop();
    }

}

总结:
1、vector和deque是支持[]运算,因此基本不需要迭代器,其他容器一律使用迭代器进行遍历。
2、stack、queue、priority_queue容器没有迭代器。
3、set、multiset、priority_queue会对元素进行排序,因它存储元素要支持比较运算符。


Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Love丶伊卡洛斯 !
评论
 Previous
C++中的虚函数表、强制类型转换、I/O流等 C++中的虚函数表、强制类型转换、I/O流等
一、虚函数表什么是虚函数表,在C++的类中,一旦成员函数中有虚函数,这个类中就会多一个虚函数表指针,这个指针指向一个虚函数表,表里面记录了这个类中所有的虚函数,当这个类被继承,它的子类中也会有一个虚函数表(不管子类中有没有虚函数),如果子类
2019-09-03
Next 
C++中的模板 C++中的模板
一、为什么使用模板1、C/C++是一种静态类型语言(预处理->汇编->编译->链接),好处是速度快,缺点是实现通用代码麻烦。例如:实现支持所有类型的快速排序。 2、借助函数重载实现通用代码,好处是实现简单,但代码段会增加。
2019-08-31
  TOC