1.什么是泛型编程
前面我们介绍的vector,list,map都是一种数据结构容器,
容器本身的存储结构不同,各容器中存在的数据类型也可以不同。
但我们在访问这些容器中数据时,拥有相同的方式。
这种方式就叫做“泛型编程”,顾名思义,不同的类型采用相同的方式来操作。

2.泛型编程的原理。
我们先看下面的两个分别访问数组和链表中元素的示例。
示例1,数组类型遍历

void show(double* arr,int n)
{
for(int i=;i<n;i++)
cout<<arr[i]<<" ";
}

示例2,链表类型遍历

struct Node
{
double item;
Node * p_next;
};
void show(Node* head)
{
for(Node* start=head;start!=;start=start->p_next)
cout<<start.item<<" ";
}

我们可以看到,数组和链表的访问方式是完全不同的。
那么,如何使用相同的方式去访问呢?
这两种数据结构的共同点是,它们都是一个顺序存储数据的容器,
所以我们可为每一种容器中定义一个相应的指针类p,在泛型编程中,叫做“迭代器类(iterator)”
该指针类中需要重载两个操作符,
1)*p,访问数据元素内容
2)p++,访问下一个数据元素
示例1,数组容器(double *本身具有*p,p++操作符):

typedef double* iterator;
void show(iterator head,int n)
{
int i=;
for(iterator start=head;i<n;++start)
{
cout<<*start<<" ";
i++
}
}

示例2,链表容器:

struct Node
{
double item;
Node * p_next;
};
class iterator
{
Node *pt;
public:
double operator*()
{
return pt->item;
}
iterator& operator++()
{
pt=pt->p_next;
return *this;
}
};
void show(iterator head)
{
for(iterator start=head;start!=;++start)
{
cout<<*start<<" ";
}
}

我们看到这两种容器的show()方法已基本相同,唯一的区别是结束判断。
在数组中,根据数组长度来判断结尾。
在链表中,根据最后一个元素指向的下一个元素指针为空来判断。
链表比数组多出来一个指向null的指针。

在泛型编程中,使用了“超尾”的概率来解决这个问题,
“超尾”是指在容器的最后一个元素后面,还有一个额外的元素,该元素表示结束。
这样数组和链表都有这个超尾指针。我们统一使用这个超尾指针来判断结尾。

3.泛型编程中迭代器的使用
C++为每个容器类(vector,list,deque等)定义了相应的迭代器类型,
其begin()返回指向第一个元素的迭代器,end()返回指向超尾元素(额外添加的元素)的迭代器。
如下例所示:

vector<double>::iterator pr;
for(pr=scores.begin();pr!=scores.end();pr++)
cout<<*pr<<endl;

在C++11中,简化了迭代器类型的定义,使用auto自动类型

for(auto pr=scores.begin();pr!=scores.end();pr++)
cout<<*pr<<endl;

4.建议使用的遍历方式
很多语言,如C#,并没有使用迭代器iterator,而是使用for,foreach等来遍历数据元素。
所以,C++中最好也避免直接使用迭代器,而尽可能使用for_each()。
C++11中,新增了for循环,如下例所示:

for(auto x:scores)
cout<<x<<endl;

参考资料:《C++ Primer.Plus》 pp.685-688

C++泛型编程原理的更多相关文章

  1. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

  2. Hadoop MapReduce 二次排序原理及其应用

    关于二次排序主要涉及到这么几个东西: 在0.20.0 以前使用的是 setPartitionerClass setOutputkeyComparatorClass setOutputValueGrou ...

  3. C++泛型编程之函数模板

    泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...

  4. hash_map原理及C++实现

    一.数据结构:hash_map原理  hash_map基于hash table(哈希表).哈希表最大的长处,就是把数据的存储和查找消耗的时间大大减少,差点儿能够看成是常数时间:而代价不过消耗比較多的内 ...

  5. 【C++】从设计原理来看string类

    1.一些C++基础知识 模板类string的设计属于底层,其中运用到了很多C++的编程技巧,比如模板.迭代器.友元.函数和运算符重载.内联等等,为了便于后续理解string类,这里先对涉及到的概念做个 ...

  6. 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  9. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

随机推荐

  1. (转)HTML5 本地存储

    原文:http://www.cnblogs.com/rainman/archive/2011/06/22/2086069.html HTML5 本地存储 1.sessionStorage 2.loca ...

  2. 2016 - 1- 19 利用多线程优化从网上加载图片的Demo

    // // ZZTableViewController.m // 多图片下载 // // Created by Mac on 16/1/19. // Copyright © 2016年 Mac. Al ...

  3. Bxm做的第一个CrackMe(已补上注册机)

    系统 : Windows xp 程序 : Bxm_CrackMe1 程序下载地址 :http://pan.baidu.com/s/1pK0a0xt 要求 : 分析算法 使用工具 :OD 可在看雪论坛中 ...

  4. URAL 2040 (回文自动机)

    Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...

  5. Selenium Waits

    Selenium高级功能包含查找等待, Selenium的查找等待有两种方式, 隐式等待(Implicit Waits)和显示等待(Explicit Waits): 这里写下我对两者的理解, 1. 隐 ...

  6. 第一个Sprint冲刺第一天

    讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论内容:延续上学期四则运算app项目. 遇到的困难:1.上学期的代码需要找回来.2.开发所需要的技术还没有达到 开发需求 :第一个冲刺,加强四则运算app的功 ...

  7. linux服务器并发与tcmalloc

    前一天使用pmap查看服务器中自己开发的游戏服务的内存使用情况,发现其中数据存储服务的内存占用率非常高,截图如下. 从截图中可以看出来,分配了大量的64MB左右的内存空间,因为对自己的服务比较了解,知 ...

  8. vs2012 + cocos2d-x 2.1.5 + win7开发环境搭建步骤

    先要让vs具备cocos2d-x项目的模板,以此可以创建新的项目(1-5步),然后把相关的源码库文件和动态连接库都拷贝到自己的项目中,以使项目可以正常运行(6-7步). 1,打开vs,设置TestCp ...

  9. 快速用springmvc搭建web应用-超越昨天的自己系列(10)

    Demo地址:http://pan.baidu.com/s/1sjttKWd 创建命令: mvn archetype:generate -DgroupId=com.witown.open.demo - ...

  10. 解决load 函数无法赋予变量名的问题

    以前非常喜欢使用load函数,因为简单,而且存储相对较大的matrix.list文件更为方便.但是load函数有一个问题是在使用其过程中无法对其载入的data赋予变量名: # save data x ...