• Cpp STL中的数据结构


    前言:

      C++STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。(摘自博客园博主蔡军帅

    下面就让我们一起来学习STL中的那些强大的容器吧!

    一、栈(stack)

    1.Definition :

      微软翻译:stack—— n. 堆栈;一堆;大量;许多;v.(使)放成整齐的一叠(或一摞、一堆)。

      百度百科:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    2.头文件:#include<stack>

    3.定义stack类型:stack<type> s;(其中type为数据类型:如int、float、char等)

    4.Correlation operation:

      (1)s.push(item);  //将item压入栈顶

      (2)s.pop();   //删除栈顶的元素,但不会返回

      (3)s.top();  //返回栈顶的元素,但不会删除

      (4)s.size();  //返回栈中元素的个数

      (5)s.empty();  //检查栈是否为空,如果为空返回true,否则返回false

    二、队列(queue)

    1.Definition:

      微软翻译:queue—— n. 行列;(储存的数据)队列;v.(人、车等)排队等候;(使)排队;列队等待

      百度百科:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表

    2.头文件:#include<queue>

    3.定义queue类型:queue<type> que;(其中type为数据类型,如int、float、char)

    4.Correlation operation:

      (1)q.push(item);  //将item压入队列尾部

      (2)q.pop();  //删除队首元素,但不返回 

      (3)q.front();  //返回队首元素,但不删除

      (4)q.back();  //返回队尾元素,但不删除

      (5)q.size();  //返回队列中元素的个数 

      (6)q.empty();  //检查队列是否为空,如果为空返回true,否则返回false

    三、动态数组(Vector)

    1.Definition:

      微软翻译:vector —— n.向量;矢量;载体;(航空器的)航线;v.【航】(对飞行中的飞机)指示航向;【航】电(磁)波导航

      百度百科:vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

    2.头文件:#include<vector>

    3.定义vector类型:vector<type> vec; 

    4.Correlation operation:

    ------------------------------------------------------------------------------------------------------------------------------      

          (1)尾部插入数字:vec.push_back(a);      

          (2)使用下标访问元素:cout<<vec[0]<<endl;记住下标是从0开始的。

          (3)使用迭代器访问元素:
              vector<int>::iterator it;
              for(it=vec.begin();it!=vec.end();it++)
              cout<<*it<<endl;
          (4)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
          (5)删除元素: vec.erase(vec.begin()+2);删除第3个元素

                  vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
          (6)向量大小:vec.size();
          (7)清空:vec.clear();

          (8)使用at()函数访问元素:cout<<vec.at(i)<<endl;

          (8)用算法reverse实现逆序:

              1) 使用reverse将元素翻转:需要头文件#include<algorithm>

               reverse(vec.begin(),vec.end());将元素翻转,即逆序排列!

    摘自:CSDN博主:那年聪聪

    -----------------------------------------------------------------------------------------------------------------------------

    四、Set

    1.Definition:

        微软翻译:n. 集;集合;一套;电视机;v. 设置;放;树立;安排 

        CSDN博主蔡军帅:关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

    2.头文件:#include<set>

    set使用方法:

    begin()     ,返回set容器的第一个迭代器

    end()    ,返回set容器的最后一个迭代器

    clear()        ,删除set容器中的所有的元素

    empty()   ,判断set容器是否为空

    max_size()   ,返回set容器可能包含的元素最大个数

    size()     ,返回当前set容器中的元素个数

    rbegin    ,返回的值和end()相同

    rend()    ,返回的值和rbegin()相同

    lower_bound(key_value) ,返回第一个大于或等于key_value的定位器

    upper_bound(key_value),返回第一个一个大于key_value的定位器

    如果找不到目标值迭代器等于end()  用upper_bound()==end()判断即可

    五、Deque

  • 相关阅读:
    Python3 collections模块的使用
    基于python的分治法和例题
    docker容器间通信 (共用宿主机)
    HTML之form表单ENCTYPE属性解析
    搭建基于码云gitee平台代码自动部署
    centos7下docker搭建nginx+phpfpm环境
    mysql主从配置
    centos7升级自带mariadb
    linux下安装docker
    centos7安装postgreSql11
  • 原文地址:https://www.cnblogs.com/Cnxz/p/12313780.html
Copyright © 2020-2023  润新知