zoukankan      html  css  js  c++  java
  • C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念

    编写不依赖于具体数据类型的程序

    将算法从特定的数据结构中抽象出来,成为通用的

    C++模板为泛型编程程序设计奠定了关键的基础

    模型:符合一个概念的数据类型称为该概念的模型,例如:
    int型是Comparable概念的模型;

    静态数据类型不是Assignable概念的模型(无法用“=”给整个静态数组赋值)

    用概念做模板参数名

    很多STL的实现代码都是使用概念来命名模板参数的

    为概念赋予一个名称,并使用这个名称作为模板参数名

    表示insertionSort这样的一个函数模板的原型:

    template <class Sortable> void insertionSort(Sortable a[], int n);

    迭代器

    迭代器是算法与容器的桥梁

      迭代器用作访问容器的元素

      算法不直接操作容器中的数据,而是通过迭代器间接操作;

    输入迭代器与输出迭代器

    输入迭代器

    istream_iterator<T>

    以输入流(如cin)为参数构造

    可用*(p++)获得下一个输入的元素

    输出流迭代器

    ostream_iterator<T>

    构造时需要提供输出流(如cout)

    可用(*p++) = x 将x输出到输出流

    两者都属于适配器

    适配器是用来为已有对象提供新的接口的对象

    输入流适配器和输出流适配器为流对象提供了迭代器的接口

    #include <iterator>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    double square(double x)
    {
        return x * x;
    }
    
    int main()
    {
        transform(istream_iterator<double>(cin), istream_iterator<double>(),
            ostream_iterator<double>(cout, "	"), square);
        cout << endl;
        return 0;
    }

    迭代器的辅助函数

    advance(p,n)

    对p执行n次自增操作

    distance(first,last)

    计算两个迭代器first和last的距离,即对first执行多少次++操作后first==last

    容器的通用功能

    相关数据类型(S表示容器类型)

    S::iterator:指向容器元素的迭代器类型

    S::const_iterator:常迭代器类型

    随机访问容器

    随机访问容器支持对容器元素进行随机访问

    s[n]:获得容器s的第n个元素

    顺序容器的特征

    顺序容器:向量,双端队列,列表,单向列表,数组

    向量:

    特点:一个可以扩展的动态数组,随机访问,在尾部插入和删除元素比较快

    双端队列

    在两端插入或者删除元素比较快

    在中间插入或者删除元素比较慢

    随机访问比较快,但比向量容器慢

    列表

    在任意位置插入和删除元素狠快

    不支持随机访问

    顺序容器的比较

    1.大量随机访问,且一般向容器尾添加元素,选择vector

    注释:不能用下标形式给vector对象赋值,下标形式只能获取值;

    2.少量随机访问,两端插入和删除元素,选择deque

    3.无随机访问,中间插入或删除元素,选择list,或forward_list

    顺序容器的插入迭代器和适配器

    顺序容器的插入迭代器

    用于向容器头部,尾部,或者中间指定位置插入元素的迭代器

    包括前插迭代器(frontinserter),后插迭代器(backinserter),任意位置插入迭代器(inserter)

    list<int> s;

    back_inserter iter(s);

    *(iter++)  = 5;//通过iter把5插入s末尾

    栈和队列模板

    栈模板

    template<class T, class Sequence = deque<T> > class stack;

    队列模板

    template<class T,class FrontInsertionSequence = deque<T> > class queue;

    栈可以用任何一种顺序容器作为基础容器,而队列只允许用前插顺序容器(双端队列或列表)

    优先级队列

    优先级队列也像栈和队列一样支持元素的压入和弹出,但元素弹出的顺序和元素的大小有关,每次弹出的总是容器中最“大”的一个元素;

    template <class T,class Sequence = vector<T> > class priority_queue;

    优先级队列的基础容器必须是支持随机访问的顺序容器;

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    运维人员如何最大限度避免误删除文件
    制作U盘启动安装CentOS Linux系统
    VMware克隆虚拟机后无法启动网卡
    由SecureCRT命令行快捷键谈学习思想
    SecureCRT同时发送命令到所有主机
    Linux下rz/sz安装及使用方法
    Linux下seq的使用
    linux tail命令的使用方法详解
    删除一个目录下的所有文件,但保留一个指定文件
    java基础知识回顾之java Thread类学习(十一)--join方法的理解
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6572485.html
Copyright © 2011-2022 走看看