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

原文地址:https://www.cnblogs.com/Cnxz/p/12313780.html