容器

在C ++中,容器是允许您存储对象的类。 例如,标准库std::list l是可调整大小的数组,用于存储某种类型T的对象。为了正式地被认为是容器类,它必须公开某些功能以便于通用编程。 我可以引用C ++标准的确切要求,但在大多数情况下,重要的容器类是标准库中的容器:std::list、deque、list、map、set和2687499344584115115/2/multiset。

重要要求之一是它们必须允许迭代器访问。

迭代器

“迭代器”在这里可能意味着两件事:它是设计模式的名称,但是在C ++中,它也是该设计模式的特定表达式的名称。 C ++迭代器是一种类型的类型,它允许使用类似指针的语法遍历一系列元素。

例如,如果您有一个数组std::list l,则可以使用普通指针作为迭代器:

int* first = a; // create an iterator that points to the beginning of the array

++first; // make the iterator point to the second element

int i = *first; // get the value of the element pointed to by the iterator

int* last = a+10; //create an "end" iterator, one which points one past the end of the array

如果我有一个链表,例如std::list l,我可以做很多事情,尽管现在我的迭代器不再只是指针,而是实现为专门用于std::list的类类型:

std::list::iterator first = l.begin(); // create an iterator that points to the beginning of the list

++first; // make the iterator point to the second element

int i = *first; // get the value of the element pointed to by the iterator

std::list::iterator last = l.end(); //create an "end" iterator, one which points one past the end of the list

或带有向量IIterator:

std::vector::iterator first = v.begin(); // create an iterator that points to the beginning of the vector

++first; // make the iterator point to the second element

int i = *first; // get the value of the element pointed to by the iterator

std::list::iterator last = v.end(); //create an "end" iterator, one which points one past the end of the vector

关于迭代器的重要之处在于,它们为我们提供了遍历元素序列的统一语法,无论序列如何存储在内存中(甚至即使存储在内存中也是如此。可以编写迭代器以迭代a的内容) 磁盘上的数据库,或者我们也可以使用迭代器包装器使流(例如IIterator)看起来也像一系列对象:

std::istream_iterator(std::cin) first;

++first; // make the iterator point to the second element

int i = *first; // get the value of the element pointed to by the iterator

std::list::iterator last; //create an "end" iterator, which marks the end of the stream

尽管因为它包装了常规的流,但是它是一种更有限的迭代器类型(例如,您不能向后移动,这意味着并非以下所有算法都适用于流迭代器。

现在,考虑到这些迭代器类型中的任何一种,我们可以使用所有旨在与迭代器一起使用的标准库算法。 例如,要查找序列中值为IIterator的第一个元素:

std::find(first, last, 4); // return the first iterator which equals 4 and which is located in the interval [first, last)

或者我们可以对序列进行排序(不适用于流迭代器):

std::sort(first, last);

或者如果我们编写一个将int平方的函数,例如:

int square(int i) { return i * i; }

然后我们可以将其应用于整个序列:

// for every element in the range [first, last), apply the square function, and output the result into the sequence starting with first

std::transform(first, last, first, square);

这就是迭代器的优点:它们抽象了容器的详细信息,因此我们可以对任何序列应用泛型操作。 多亏了迭代器,相同的IIterator或sort实施也可用于链接列表和数组,甚至可用于您自己的自制容器类。

通用编程

泛型编程基本上是您的代码应尽可能通用的想法。 如上面的迭代器示例所示,我们提供了一组类型必须支持的一组通用功能才能被称为迭代器,然后编写适用于任何迭代器类型的算法。

将此与传统的面向对象编程进行比较,在传统的面向对象编程中,迭代器必须通过继承某种IIterator接口来“证明”它们是迭代器。 那将阻止我们使用原始指针作为迭代器,因此我们将失去通用性。

在C ++中,使用通用编程,我们不需要官方接口。 我们只是使用模板编写算法,因此它们接受恰好看起来像迭代器的任何类型,而不管它们在何处,何时以及如何定义,以及它们是否从公共基类或接口派生。

c 是泛型程序设计语言,c ++中的“泛型编程”是什么意思?相关推荐

  1. c 是泛型程序设计语言,在C语言中实现泛型编程

    0x00 泛型编程概述 泛型编程是一个非常常见的编程方式.主要目的是实现静态联编,使得函数可以接受不同类型的参数,并且在编译的时候确定正确的类型. 很多语言都对泛型编程提供了支持,比如在C++中可以使 ...

  2. Go 程序设计语言书中 源码

    Go 程序设计语言源码: https://github.com/Mountains-and-rivers/gopl.io

  3. 自动化专业中的c语言案例分析,案例教学法论文,关于案例教学法在《c语言程序设计》课程中的应用相关参考文献资料-免费论文范文...

    导读:本论文主要论述了案例教学法论文范文相关的参考文献,对您的论文写作有参考作用. 左永文 (吉林工业职业技术学院自动化系 吉林省吉林市 132013) 摘 要:针对C语言程序设计课程内容自身的特点, ...

  4. C++电脑程序设计语言介绍

    C++是一种使用非常广泛的电脑程序设计语言. 它是一种静态数据类型检查的,支持多范型的通用程序设计语言 . C++支持过程化程序设计 . 数据抽象化 . 面向对象程序设计 . 泛型程序设计 . 基于原 ...

  5. C++程序设计语言编程风格演变史

    程序代码也有风格,这算不得什么新鲜事.早在20世纪80年代,C语言程序员就必须在K&R风格和ANSI风格之间择善而从.但平心而论,我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如 ...

  6. 以下关于程序设计语言的叙述中,不正确的是()【最全!最详细解释!!】

    以下关于程序设计语言的叙述中,不正确的是() A. 脚本语言不使用变量和函数 B. 标记语言常用描述格式化和链接 C. 脚本语言采用解释方式实现 D. 编译型语言的执行效率更高 解释: 编程语言:是用 ...

  7. 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  8. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt

    C语言程序设计李泽中课件第4章解读 河南商业高等专科学校 4.4 程序综合举例 [例4.12]输入一个无符号短整数和进制代号(d-十进制.0-八进制.x-十六进制),然后将数进制代号要求输出. 程序代 ...

  9. c语言程序设计删除,C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句...

    C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句,要正确处理带引号的字符串与字符常量,以C语言中,注释不允许嵌套. 本程序运行后,将要求用户输入一个当前目录下的C源码程序文件名,读取 ...

最新文章

  1. 红帽Redhat6.4 iso下载地址
  2. python 创建空文件的方法
  3. linux传输文件无密码,Linux下scp无密码上传 下载 文件 目录
  4. vue 环境的搭建及初始化项目
  5. 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解
  6. Windows函数错误处理
  7. 查看服务器是有有默认共享文件,服务器共享文件远程查看
  8. mysql 数据删除 索引_MySQL操作之索引创建与删除
  9. opencv 轮廓特征
  10. jQuery迷你帮助查找功能
  11. 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
  12. Anaconda下载与安装详解
  13. C语言实现直接选择排序
  14. linux系统发育树的构建步骤,步一步教你如何做系统进化树
  15. debian10杀毒软件安装和使用
  16. 微信一键连wifi服务器,微信小程序一键连wifi
  17. 初识 PS CS6(十三)___用快速选择工具择图
  18. win10使用共享文件夹传输数据提示输入网络凭据问题
  19. 【Pytorch】rgb转lab颜色空间转换
  20. U盘禁止写入/SD卡被禁用怎么解除

热门文章

  1. sklearn自学指南(part24)--随机梯度下降
  2. 2020春招机考汇总1(Python):农场养鸡、连续子序列最大值的期望
  3. 剑指 Offer 面试题45:把数组排成最小的数——Python内置函数 map()、__lt__()、join()、sorted()
  4. 2021年必备 Python 插件!
  5. SKlearn参数详解—随机森林
  6. SAP UI5 未来发展的趋势之一:拥抱 TypeScript
  7. windows 10 使用 VMWare workstation player 启动 windows XP 虚拟机出错的问题
  8. SAP Spartacus buildCmsStructure 构建逻辑
  9. Angular ctorParameters,decorator等元数据,包含在ActivatedRouteSnapshot数据结构里
  10. 使用Angular可重用Component思路实现一个自带图标(icon)的input控件