zoukankan      html  css  js  c++  java
  • 标准模板库

    C++中有两个方面体现重用:

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

    标准模板库就是一些常用数据结构和算法的模板的集合。

    容器:容纳各种数据类型的通用数据结构,是类模板。

    迭代器:可用于依次存取容器中的元素,类似于指针

    算法:用来操作容器中的元素的函数模板。

    容器概述

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

    1)顺序容器

    vector,deque,list

    2)关联容器

    set,multiset,map,multimap

    3)容器适配器

    stack,queue,priority——queue

    顺序容器

    • vector:动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能(大部分情况下是常数时间)。
    • deque:双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。
    • 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:删除迭代器指向的元素(可能会使该迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器。

    迭代器

    • 用于指向顺序容器和关联容器中的元素
    • 迭代器用法和指针类似
    • 有const和非const两种
    • 通过迭代器可以读取它指向的元素
    • 通过非const迭代器还能修改其指向的元素

    定义一个容器类的迭代器的方法:

    • 容器类名::iterator       变量名
    • 容器类名::const_iterator    变量名

    访问一个迭代器指向的元素:

    * 迭代器变量名

     

    input output

    /

    Forward

    |

    bidirectional

    |

    random access

     

    迭代器操作说明

    (1)所有迭代器

    p++                                             后置自增迭代器

    ++p                                             前置自增迭代器

    (2)输入迭代器

    *p                                       复引用迭代器,作为右值

    p=p1                                     将一个迭代器赋给另一个迭代器

    p==p1                                    比较迭代器的相等性

    p!=p1                                    比较迭代器的不等性

    (3)输出迭代器

    *p                                       复引用迭代器,作为左值

    p=p1                                     将一个迭代器赋给另一个迭代器

    (4)正向迭代器

    提供输入输出迭代器的所有功能

    (5)双向迭代器

    --p                                               前置自减迭代器

    p--                                               后置自减迭代器

    (6)随机迭代器

    p+=i                                             将迭代器递增i位

    p-=i                                             将迭代器递减i位

    p+i                                           在p位加i位后的迭代器

    p-i                                           在p位减i位后的迭代器

    p[i]                                   返回p位元素偏离i位的元素引用

    p<p1              如果迭代器p的位置在p1前,返回true,否则返回false

    p<=p1         p的位置在p1的前面或同一位置时返回true,否则返回false

    p>p1              如果迭代器p的位置在p1后,返回true,否则返回false

    p>=p1         p的位置在p1的后面或同一位置时返回true,否则返回false

     参考链接:

    https://www.coursera.org/learn/cpp-chengxu-sheji

  • 相关阅读:
    待解决问题集锦
    蓝桥杯--- 历届试题 连号区间数(水题)
    蓝桥杯---历届试题 翻硬币 (水题)
    nyoj 678 最小K个数之和
    hdoj 2 括号配对问题【数组模拟实现+STL实现】
    hdoj 1016 Prime Ring Problem
    nyoj 62 笨小熊
    nyoj 47 过河问题
    nyoj 456 邮票分你一半
    nyoj 171 聪明的kk
  • 原文地址:https://www.cnblogs.com/helloforworld/p/5655431.html
Copyright © 2011-2022 走看看