快速业务通道

冒号课堂§3.1:泛型范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
,返身在黑板上写下几道题——

1.从一个整数数组中随机抽取十个数,对其中的素数求和

2.将一个无序整数集中所有的完全平方数换成其平方根

3.从学生成绩表中,列出门门都及格且平均分在70分以上的学生名单

4.在一个着色二元树中,将所有的红色结点涂成蓝色

5.将一个字符串从倒数第三个字符开始反向拷贝到另一个字符串中

6.每从标准输入读取一个非数字的字符X,于标准输出打印‘X不是数字字符’

句号暗忖,这有何难?不过是些常规题罢了。不料冒号的问题却出人意表:“请问它们之间有何共同之处?能否共享同一段代码?”

见众人缄默已久,冒号接着投影出一段代码——

template <class Iterator, class Act, class Test> void process(Iterator begin, Iterator end, Act act, Test test) // 对容器中在给定范围内(即起于begin止于end)所有满足给定条件的元 //素(即test(元素)==true)进行处理(即act(元素)) {    for ( ; begin != end; ++begin)  // 从头至尾遍历容器内元素      if (test(*begin)) act(*begin); // 若当前元素满足条件,则对其采取行动 }

冒号课堂§3.1:泛型范式(3)

时间:2011-06-25 BlogJava xyz98

“STL有三要素:算法(algorithm)、容器(container)和迭代器(iterator)。算法是一系列切实有效的步骤;容器是数据的集合,可理解为抽象的数组;迭代器是算法与容器之间的接口,可理解为抽象的指针或者游标。”冒号讲述道,“算法串联数据,如脊贯肉;数据实化算法,如肉附脊。只有抽象出表面的数据,算法的脊梁才能显现。以上几题看似风马牛不相及,若运用泛型思维,便可发现它们的共性:对指定集合中满足指定条件的元素进行指定处理。用模板语言,寥寥数行即勾勒完毕。”

问号诧异道:“相比前面的max模板,这儿连元素的数据类型T都不见了?”

冒号回答:“元素被容器封装了。”

问号追问:“可连容器也看不到啊?”

冒号料有此问:“容器通过它的迭代器参与算法。”

句号豁然开朗:“通过模板,泛化了容器——可以是数组、列表、集合、映射、队列、栈、字符串等等;泛化了元素——可以是任何数据类型;泛化了处理方法和限定条件——可以是任何函数。”

冒号提醒道:“补上两点:这里的处理方法和限定条件不限于函数,还可以是函子(functor)[2]——自带状态的函数对象;另外迭代器也被泛化了——可以从前往后移动,可以从后往前移动,可以来回移动,可以随机移动,可以按任意预先定义的规律移动。”

叹号由衷感叹:“果然强悍无比啊!”

逗号倒也心细:“最后一题中标准输入也算容器吗?”

“为什么不呢?只要一个对象配备了迭代器,它就可以作为容器来对待。I/O流上就有现成的迭代器,当然你也可以自行定制。索性我们来看看这道题的解法吧。”冒号给出了第六题的实现代码——

#include <iostream> #include “process.h” // 前述process所在的头文件 using namespace std; // 判断字符是否为非数字字符 bool notDigit(char c) {    return (c < ''0'') || (c > ''9''); } // 打印非数字字符 void printNondigit(char c) {    cout << c << "不是数字字符" << endl; } int main() {    process(istream_iterator<char>(cin), istream_iterator<char>(), printNondigit, notDigit);    return 0; }

逗号打量了半天:“这里完全看不到I/O读取的过程,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号