【C++】STL容器(一)

一.deque(顺序容器)

    deque容器是一个双端容器,支持快速随机访问。在头尾位置插入/删除速度非常快。

    例如:

    deque<int> dq;
    dq.push_back(3);//从尾部压入
    dq.push_front(2);//从头部压入
    dq.pop_back(); //从尾部弹出
    dq.pop_front();//从头部弹出

    deque可以使用下表进行访问,也可以使用范围for语句,还可以使用迭代器对deque进行遍历

    deque<int>::iterator dq_iter;
    for (dq_iter = dq.begin(); dq_iter != dq.end(); ++dq_iter)
    {
        cout << *dq_iter << endl; //迭代器是指针形式
    }

    使用迭代器后,无法无法使用下标操作符来查看是容器当中的哪一个数,我们可以使用算法头文件中的(#include<algorithm>)distance()函数来算出下标。

    auto dis = distance(dq.begin(),dq_iter);

    deque可以使用insert()在中间插入元素

    dq_iter = dq.begin();
    dq.insert(dq_iter,3); // 在deque容器前面插入3
    de_iter = dq.end();
    dq.i=nsert(de_iter,10,30) // 在容器末尾插入10个30
    dq_iter = dq.begin();
    dq_iter += 3; //deque的iter可以直接进行+/-操作
    dq.insert(dq_iter, 2, 100); //在第三个元素后面插入2个100

    deque可以使用erase()函数在中间随机删除数据:

    dq_iter = dq.begin();
    dq.erase(dq_iter + 3, dq_iter + 5); //删除(3,5]区间的数据(注意区间)

二.list(顺序容器)

    list是一个双向链表,只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都非常的快。

    list支持push_back()函数和push_front()函数,也支持pop_back()和pop_front()函数。

    同时,list容器还可以使用insert() 函数从中间插入:

    例如:

list<int> a;
a.push_back(3);//尾部插入
a.push_back(4);
a.push_back(5);
a.push_front(2); //头部插入
a.push_front(1);
a.push_front(0);

list<int>::iterator list_iter;
list_iter = a.begin();
a.insert(list_iter,10); //在第一个数前面插入10.

list_iter = a.begin();
for (int i = 0; i < 3; i++) //list容器的迭代器,不能直接跳到某个位置,如果需要在
    list_iter++; //从a.begin()位置开始,往后移3个位置
a.insert(list_iter, 4, 0);  // 在第三个数后面插入4个0 

      同时,list还可以利用insert()在容器中插入数据区间

    list_iter = a.begin();
    list<int> b;
    b.push_back(100);
    b.push_back(200);
    b.push_back(300);

    a.insert(list_iter, b.begin(), b.end()); // 在a容器的开头插入[b.begin(),b.end()]的数据。

    list访问成员数据,不支持下标操作符,所以访问可以使用范围for语句或者使用迭代器。

    list删除数据也非常的简单,使用erase()函数即可。括号内是迭代器类型,表明删除迭代器指定位置的数据,同时也可以删除指定区间的数据。

    list数据支持自动排序,使用的函数为sort(),操作完后,顺序会自动从小到大排列。同时可以使用reverse()函数对数据进行反转,两个配合起来使用,可以达到从大到小排列的目的。

    a.sort(); //数据从小到大排列
    a.reverse();//数据进行反转

三、stack(顺序容器适配器)

    stack是一种栈的数据结构,相信学过数据结构的同学对这个应该特别熟悉。先进后出/后进先出是它的一个重要特点,它是一个自适应容器。

    栈可以定义成多种类型:

    stack<int, vector<int>> a; //vector类型的栈
    stack<int, list<int>> b;  //list类型
    stack<int, deque<int>> c; //deque类型
    stack<int>  d; //默认类型,为deque类型

    向栈中压数据使用push()函数,弹出数据使用pop()函数;

    访问栈的顶层数据使用top()函数;

    查看栈的大小使用size()函数;

    判断栈是否为空栈,使用empty()函数。

    栈看似简单,觉得也没啥用,实际则不然,在底层系统相关的程序当中使用的比较多。如底层内存的分配,函数的调用等等。

四、queue(顺序容器适配器)

    队列容器,先进先出。和stack一样,是一个自适应容器。

    可以用list类做队列,还可以用deque做队列。但是和stack不一样的是,queue不能用vector来做队列。可以进行双向操作。

    几个常用函数的介绍:

    q.empty():判断队列是否为空

    q.size() : 查看队列的大小

    q.front() : 查看队首元素

    q.back() : 查看对位元素

    q.pop() : 出队,从队为删除数据

    q.push(item) : 入队,从队首插入数据

五、priority_queue(顺序容器适配器)

    最大值/最小值优先级队列,是一个自适应容器,但是不能用list来做队列。

    用法和queue一样。先进先出,压进去的数据会进行排队,弹出来的数据为当前数据中的最大值/最小值

    默认情况下,为最大值。如果最小值优先级队列的话,需要加上grater的标签,如下:

    priority_queue<int> q1;//默认情况,最大值队列
    priority_queue<int,deque<int>> q2;//默认情况,最大值队伍
    priority_queue<int,deque<int>,grater<int>> q3; //最小值优先级队列


猜你喜欢

转载自blog.csdn.net/zpc666666/article/details/80986547