zoukankan      html  css  js  c++  java
  • C/C++STL常用容器用法总结

    一、容器

    概念:容器是储存其他对象的对象。被储存的对象必须是同一类型。

    基本特征:以下用X表示容器类型(后面会讲到),T表示储存的对象类型(如int);a和b表示为类型X的值;u表示为一个X容器的标识符(如果X表示vector<int>,则u是一个vector<int>对象。)

    表 达 式

    返 回 类 型 

    说 明

    复 杂 度

    X::iterator

    指向T的迭代器类型

    满足正向迭代器要求的任何迭代器

    编译时间

    X u

    创建一个名为u的空容器

    固定

    X ()

    创建一个匿名空容器

    固定

    X u(a)

    同X u(a);

    线性

    a.begin()

    迭代器

    返回指向容器第一个元素的迭代器

    固定

    a.end()

    迭代器

    返回指向超尾值的迭代器

    固定

    a.size()

    无符号整型

    返回元素个数

    固定

    a.swap()

    void

    交换a和b内容

    固定

    a == b

    可转换为bool

    如果a和b长度相当且每个元素都相等,则为真

    线性

    a != b

    可转换为bool

    返回!(a == b)

    线性

    二、序列容器

    常用容器:vector、deque、list、queue、stack

    概念:序列是对基本容器的一种改进,在保持其基础功能上增加一些我们需要的更为方便的功能。

    要求:序列的元素必须是严格的线性顺序排序。因此序列中的元素具有确定的顺序,可以执行将值插入到特定位置、删除特定区间等操作。

    序列容器基本特征:以下用t表示类型为T(储存在容器中的值的类型)的值,n表示整数,p、q、i和j表示迭代器。

    表 达 式

    返 回 类 型

    说 明

    X a(n,t)

     

    声明一个名为a的由n个t值组成的序列

    X(n,t)

     

    创建一个由n个t值组成的匿名序列

    X a(i,j)

     

    声明一个名为a的序列,并将其初始化为区间[i,j)的内容

    X(i,j)

     

    创建一个匿名序列,并将其初始化为区间[i,j)的内容

    a.insert(p,t)

    迭代器

    将t插入到p的前面

    a.insert(p,n,t)

    void

    将n个t插入到p的前面

    a.insert(p,i,j)

    void

    将区间[i,j)的元素插入到p前面

    a.erase(p)

    迭代器

    删除p所指向的元素

    a.erase(p,q)

    迭代器

    删除区间[p,q)中的元素

    a.clear()

    void

    清空容器

     

    不同容器特有的特征:

    表 达 式

    返 回 类 型

    含 义

    支 持 的 容 器

    a.front()

     

     

    vector、list、deque

    a.back()

     

     

    vector、list、deque

    a.push_front(t)

     

     

    list、deque

    a.push_back(t)

     

     

    vector、list、deque

    a.pop_front(t)

     

     

    list、deque

    a.pop_back(t)

     

     

    vector、list、deque

    a[n]

     

     

    vector、deque

    a.at(t)

     

     

    vector、deque

     

    *a[n]和a.at(n)都返回一个指向容器中第n个元素的引用。区别在于:如果n落在容器有效区间之外,a.at(n)将执行边界检查,并引发out_of_range异常。

    *之所以vector没有push_front(),是因为vector执行此表达式复杂度为线性时间,而deque为固定时间。(这与它们的特性有关,下面讲到)

    (一)vector

    •  vector是最简单也是最重要的一个容器。其头文件为<vector>.
    • vector是数组的一种类表示,它有以下优点:自动管理内存、动态改变长度并随着元素的增减而增大或缩小。
    •  在尾部添加元素是固定时间,在头部或中间添加或删除元素是线性时间。
    • vector是可反转容器。下面以vector为例介绍可反转容器。

    (待补充)

    (二)deque

    • 头文件<deque>
    • 在STL中deque类似vector,并且支持随机访问。区别在于:从deque起始位置插入删除元素时间是固定的。
    •  为了实现在deque俩段执行插入和删除操作的时间为固定这一目的,deque对象设计比vector设计更为复杂一些。因此,在序列中部执行插入删除操作时,vector更快一些。

    (三)list

    • list表示双向链表。头文件<list>
    • list为可反转容器
    • list不支持数组表示法和随机访问。
    • 与矢量迭代器不同,从容器中插入或删除元素之后,链表迭代器指向的元素不变。这与链表的特性有关,删除链表中的元素并不改变其它元素位置,只是修改链接信息。(代码证明)
    • 不同于vector,list不强调随机访问与快速访问,list强调的是元素的快速插入与删除
    • 再次提醒:序列容器都是线性排序,因此list首尾不会相连。
    • list成员函数:

    函 数

    说 明

    void merge(list<T,Alloc>& x)

    将链表x与调用链表合并,俩个链表必须已排序。合并后的经过排序的链表保存在调用链表中,x为空。线性时间。

    void remove(const T & val)

    从链表中删除val的所有实例。线性时间。

    void sort()

    使用<运算符对链表进行排序,复杂度NlogN

    void splice(iterator pos,list<T,Alloc>x)

    将链表x的类容插入到pos前面,x将为空。固定时间。

    void unique()

    将连续相同的元素压缩为单个元素。线性时间。

     放入代码中:

    #include<iostream>
    #include<list>
    #include<iterator> 
    #include<algorithm>
    using namespace std;
    
    void outint(int n){cout << n << " ";}
    
    void Show(list<int> dice,int flag){
    	if(flag)	cout<<"dice = ";
    	else	cout<< " two = ";
    	for_each(dice.begin(),dice.end(),outint);//输出容器的元素。 
    	cout << endl;
    }//此函数用来输出容器元素 
    
    int main()
    {
    	list<int> dice(5,2);//一种赋初值方法。5个2 
    	Show(dice,1);
    	int a[] = {1,5,4,3};
    	dice.insert(dice.begin(),a,a+4);//insert函数用法 
    	Show(dice,1);
    	list<int> two(dice);//另一种赋初值方法,其值与dice相等 
    	Show(two,0);
    	dice.splice(dice.begin(),two);//splice函数用法 
    	Show(dice,1);
    	Show(two,0); //two清空 
    	two = dice;
    	dice.unique();//unique压缩连续相同的元素
    	Show(dice,1);
    	dice.sort();//sort函数用法 
    	two.sort(); 
    	Show(dice,1);
    	Show(two,0); 
    	dice.merge(two);//merge函数用法,将two合并到dice中,two将为空。
    	Show(dice,1);
    	Show(two,0); 
    	dice.remove(2);//移除所有2 
    	Show(dice,1);
    	return 0;
    }

    insert()与splice()之间的不同主要在与:insert()将原始区间的副本插入到目标地址,而splice()则将原始区间移到目标地址。splice()执行后,迭代器仍有效。也就是说原本指向two中一个元素的迭代器,在使用过splice后仍然指向它。

    remove()函数还有更加方便的拓展,将在以后讲到。

    (四)queue

    • 头文件<queue>
    • queue不允许随机访问队列元素,不允许遍历队列,可以进行队列基本操作
    • 可以将元素添加到队尾,从队首删除元素,查看队尾和队首的值,检查元素数目和测试队列是否为空
    • queue的操作:
      方 法说 明
      bool empty()const如果队列为空,则返回true,否则返回false
      size_type size()const返回队列中元素的数目
      T& front()返回指向队首元素的引用
      T& back()返回指向队尾元素的引用
      void push(const T& x)在队尾插入x
      void pop()删除队首元素
      pop()是一个删除数据的方法,不是检索数据的方法。如果要使用队列中的值,首先要使用front()来检索这个值,然后用pop()将他从队列中删除。

    (五)stack

    • 头文件<stack>
    • stack是一个适配器,它给底层类(默认vector)提供典型栈接口。
    • stack不允许随机访问栈元素,不允许遍历栈,把使用限制在定义栈的基本操作上
    • 可以将值压入栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目,测试栈是否为空
    • stack的操作:
    • 方 法说 明
      bool empty()const如果栈为空,返回true,否则返回false
      size_type size()const返回栈中元素数目
      T& top()返回指向栈顶元素的引用
      void push(const T& x)在栈顶插入x
      void pop()删除栈顶元素
      与queue类似,如果要使用栈中的值,必须首先使用top()来检索这个值,然后使用pop()将它从栈顶删除。

    序列容器还有forword_list(C++11)、priority_queue、array,有兴趣的可以去看一看,但我觉的用的不太常用,不打算整理出来了。

    三、关联容器

    内容太多了,为了美观以及方便查看不得不另起一篇。

    关联容器(map与set)详解



  • 相关阅读:
    MyBatis 内连接association 左外连接collection
    mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
    SpringMVC 使用Form标签库制作登录表单
    SpringMVC 配置过滤器解决中文乱码问题
    用户登录模块————账户安全问题
    HashSet,TreeSet和LinkedHashSet的区别
    SpringMVC 服务器端验证
    php输出(下载)文件
    26进制(字母)转十进制算法
    PHP之可变变量
  • 原文地址:https://www.cnblogs.com/long98/p/10352261.html
Copyright © 2011-2022 走看看