c 是泛型程序设计语言,c ++中的“泛型编程”是什么意思?
容器
在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 ++中的“泛型编程”是什么意思?相关推荐
- c 是泛型程序设计语言,在C语言中实现泛型编程
0x00 泛型编程概述 泛型编程是一个非常常见的编程方式.主要目的是实现静态联编,使得函数可以接受不同类型的参数,并且在编译的时候确定正确的类型. 很多语言都对泛型编程提供了支持,比如在C++中可以使 ...
- Go 程序设计语言书中 源码
Go 程序设计语言源码: https://github.com/Mountains-and-rivers/gopl.io
- 自动化专业中的c语言案例分析,案例教学法论文,关于案例教学法在《c语言程序设计》课程中的应用相关参考文献资料-免费论文范文...
导读:本论文主要论述了案例教学法论文范文相关的参考文献,对您的论文写作有参考作用. 左永文 (吉林工业职业技术学院自动化系 吉林省吉林市 132013) 摘 要:针对C语言程序设计课程内容自身的特点, ...
- C++电脑程序设计语言介绍
C++是一种使用非常广泛的电脑程序设计语言. 它是一种静态数据类型检查的,支持多范型的通用程序设计语言 . C++支持过程化程序设计 . 数据抽象化 . 面向对象程序设计 . 泛型程序设计 . 基于原 ...
- C++程序设计语言编程风格演变史
程序代码也有风格,这算不得什么新鲜事.早在20世纪80年代,C语言程序员就必须在K&R风格和ANSI风格之间择善而从.但平心而论,我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如 ...
- 以下关于程序设计语言的叙述中,不正确的是()【最全!最详细解释!!】
以下关于程序设计语言的叙述中,不正确的是() A. 脚本语言不使用变量和函数 B. 标记语言常用描述格式化和链接 C. 脚本语言采用解释方式实现 D. 编译型语言的执行效率更高 解释: 编程语言:是用 ...
- 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...
- c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
C语言程序设计李泽中课件第4章解读 河南商业高等专科学校 4.4 程序综合举例 [例4.12]输入一个无符号短整数和进制代号(d-十进制.0-八进制.x-十六进制),然后将数进制代号要求输出. 程序代 ...
- c语言程序设计删除,C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句...
C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句,要正确处理带引号的字符串与字符常量,以C语言中,注释不允许嵌套. 本程序运行后,将要求用户输入一个当前目录下的C源码程序文件名,读取 ...
最新文章
- 红帽Redhat6.4 iso下载地址
- python 创建空文件的方法
- linux传输文件无密码,Linux下scp无密码上传 下载 文件 目录
- vue 环境的搭建及初始化项目
- 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解
- Windows函数错误处理
- 查看服务器是有有默认共享文件,服务器共享文件远程查看
- mysql 数据删除 索引_MySQL操作之索引创建与删除
- opencv 轮廓特征
- jQuery迷你帮助查找功能
- 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
- Anaconda下载与安装详解
- C语言实现直接选择排序
- linux系统发育树的构建步骤,步一步教你如何做系统进化树
- debian10杀毒软件安装和使用
- 微信一键连wifi服务器,微信小程序一键连wifi
- 初识 PS CS6(十三)___用快速选择工具择图
- win10使用共享文件夹传输数据提示输入网络凭据问题
- 【Pytorch】rgb转lab颜色空间转换
- U盘禁止写入/SD卡被禁用怎么解除
热门文章
- sklearn自学指南(part24)--随机梯度下降
- 2020春招机考汇总1(Python):农场养鸡、连续子序列最大值的期望
- 剑指 Offer 面试题45:把数组排成最小的数——Python内置函数 map()、__lt__()、join()、sorted()
- 2021年必备 Python 插件!
- SKlearn参数详解—随机森林
- SAP UI5 未来发展的趋势之一:拥抱 TypeScript
- windows 10 使用 VMWare workstation player 启动 windows XP 虚拟机出错的问题
- SAP Spartacus buildCmsStructure 构建逻辑
- Angular ctorParameters,decorator等元数据,包含在ActivatedRouteSnapshot数据结构里
- 使用Angular可重用Component思路实现一个自带图标(icon)的input控件