C++学习笔记36:标准模板库STL

泛型程序设计
1 C++语言的核心优势之一就是便于软件重用
2 C++中有两个方面体现重用:

        1 面向对象的思想:继承和多态, 标准类库
        2 泛型程序设计的思想:模板机制,以及标准模板库STL

3 简单的说就是使用模板的程序设计法。
4 将一些常用的数据结构(比如链表, 数组, 二叉树 写成类模板)和算法(比如排序,查找 写成函数模板)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。
5 标准模板库就是一些常用数据结构和算法的模板的集合
6 有了STL,不必再写大多的标准数据结构和算法,并且可获得非常高的性能

STL中的基本的概念

    容器:可容纳各种数据类型的通用数据结构,是类模板
    迭代器:可用于依次存取容器中元素,类似于指针
    算法:用来操作容器中的元素的函数模板
        -- sort()来对一个vector中的数据进行排序
        -- find()来搜索一个list中的对象
        算法本身与他们操作的数据的类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
    eg:
        int array[100];
        该数组就是容器,而int*类型的指针变量就可以作为迭代器,sort算法可以作用于该容器上,对其进行排序:
        sort(array, array + 70);    // 将前70个元素排序 其中array为迭代器  array+70也为迭代器

容器概述
1 可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模板,分为三种:

        1)顺序容器
            vector:动态一维数组, deque:双向队列, list:双向链表
        2)关联容器
            set, multiset, map, multimap
        3)容器适配器
            stack:栈, queue:队列, priority_queue:优先级队列

2 对象被插入容器中时,被插入的是对象的一个复制品。

	许多算法,比如排序,查找,要求对容器中的元素进行比较,有的容器本身就是排序的,所以,放入容器的对象所属的类,往往还应该重载 == 和 < 运算符。

顺序容器简介
    容器并非排序的,元素的插入位置同元素的值无关。
    有vector, deque, list三种
    -- vector 头文件<vector>
        动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能(大部分情况下是常数时间)
        vector在实现的时候存储空间会预先多分配一些,例如只有10个元素的情况下,vector也会事先分配32个元素的空间,好处在于添加第11个元素的时候,不需要重新分配存储空间
        vector在头部或者中间插入、删除一个元素,时间复杂度为O(n);
    -- deque  头文件<deque>
        双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增删元素具有较佳的性能(大部分请情况下为常数时间)。
        内存中连续九个单元:
                head           tail
        空格 空格 a0 a1 a2 a3 a4 空格 空格
        deque是双向队列,会有一个队头指针head和队尾指针tail
    -- list 头文件<list>
        双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取

关联容器简介
    -- 元素是排序的
    -- 插入任何元素,都按相应的排序规则来确定其位置
    -- 在查找时具有非常好的性能
    -- 通常以平衡二叉树方式实现,插入和检索的时间都是O(log(N))
    -- set/multiset 头文件 <set>
        set即集合。set中不允许相同元素,multiset中允许有形同的元素。
    -- map/multimap 头文件 <map>
        map与set不同在于map中存放的元素有且仅有两个成员变量,一个名为first,另一个名为second,map根据first值对元素进行从小到大排序,并可快速低根据first来检索元素。
        map同multimap的不同在于是否允许相同的first值的元素。

容器适配器简介
    -- stack: 头文件 <stack>
        栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出
    -- queue: 头文件 <queue>
        队列。插入只可以在尾部进行,删除、检索和修改之允许从头部进行。先进先出
    -- priority_queue: 头文件 <queue>
        优先级队列。最高优先级元素总是第一个出列

顺序容器和关联容器中都有的成员函数
    begin   返回指向容器中第一个元素的迭代器
    end     返回指向容器中最后一个元素后面位置的迭代器
    rbegin  返回指向容器中最后一个元素的迭代器
    rend    返回指向容器中第一个元素后面的位置的迭代器
    erase   从容器中删除一个或几个元素
    clear   从容器中删除所有元素

顺序容器的常用成员函数
    front:  返回容器中第一个元素的引用
    back:   返回容器中最后一个元素的引用
    push_back:  在容器末尾添加新元素
    pop_back:   删除容器末尾的元素
    erase:  删除迭代器指向的元素(可能会使迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值