泛型程序设计的基本概念

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

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

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, "\t"), square);
cout << endl;
return ;
}

迭代器的辅助函数

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;

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

C++学习笔记53:泛型程序设计与C++标准模板库的更多相关文章

  1. 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语

    有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...

  2. 8、泛型程序设计与c++标准模板库4.标准c++库中的算法

    标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...

  3. 8、泛型程序设计与c++标准模板库5.函数对象

    1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓“函数对象”其实就是一个行为类似函数的对象, ...

  4. 第十章 泛型程序设计与C++标准模板库 泛型程序设计及STL的结构

  5. 8、泛型程序设计与c++标准模板库3.迭代器

    理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...

  6. 8、泛型程序设计与c++标准模板库2.5容器适配器

    容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的 ...

  7. 8、泛型程序设计与c++标准模板库2.4列表容器

    列表容器主要用于存放链表,其中的链表是双向链表,可以从任意一端开始遍历.列表容器是需要按顺序访问的容器.另外,列表容器不支持随机访问迭代器,因此某些算法不能适合于列表容器.列表容器还提供了另一种操作- ...

  8. 8、泛型程序设计与c++标准模板库2.3双端队列容器

    双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为& ...

  9. 8、泛型程序设计与c++标准模板库2.2向量容器

    向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构 ...

随机推荐

  1. Fisher–Yates shuffle 算法

    费希尔 - 耶茨洗牌 维基百科,自由的百科全书     所述费-耶茨洗牌是一种算法,用于产生随机排列的有限的序列 -in平原而言,算法打乱的序列.该算法有效地将所有元素放在帽子里; 它通过随机从帽子中 ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  3. 005-2-Python文件操作

    Python文件操作(file) 文件操作的步骤: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件(操作文件后记住关闭) 1.读写文件的基础语法: open() 将会返回一个 ...

  4. config.GetSection(key)编译不通过

    要安装这个版本

  5. SpringMVC - 1.快速入门

    1. HelloWorld 步骤: 加入 jar 包 mons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RE ...

  6. docker挂载点泄露问题

    本来以为我不会遇到. 结果还是遇到了. 现象为k8s delete pod时,系统一直显示Terminatiing,无论多久都不能正常. 以下两个帖子大概说明了是怎么回事. https://blog. ...

  7. java数组知识点总结

    数组是一个用来存储同一个数据类型多个元素的一个容器(数组长度是固定的,数组中存储的元素的数据类型要求一致) 1.格式: 格式1: 数据类型[] 数组名 = new 数据类型[数组长度]; 格式2: 数 ...

  8. SP3734 PERIODNI - Periodni

    题解: 第一道笛卡尔树dp 会发现以一个点为分界 如果左边大于它右边大于它 那么大于的那部分是相互不影响的 于是我们对序列建立笛卡尔树 满足父亲节点的v<儿子节点的v 然后这棵树的中序遍历为原序 ...

  9. JMeter中BeanShell断言使用一

    Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面 首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS ...

  10. nginx配置2

    第四节 nginx 配置文件 1 keepalive_timeout   65;  设定保存长久连接时长 0代表禁止, 若不设置默认是75s 2keepalive_requests   nu;  在一 ...