模板如何应用于泛型 (C 到C++ 阅读笔记)

模板如何应用于泛型 (C 到C++ 阅读笔记)

C++ 泛型编程示例

以下来自“5月预报”里提到的那篇文章 文中这里要实现一个遍历算法的泛型。

文章说:
使用模板技术来抽象类型,这样可以写出与类型无关的数据结构(数据容器)。
使用一个迭代器来遍历或是操作数据结构内的元素。
C 语言的代码:

/**
 * @brief 遍历数组a[size] 查找是否存在target 不存在返回-1
 * 
 * @param a 查找的数组地址
 * @param size 查找的数组大小
 * @param target 查找匹配的对象
 * @param elem_size 查找的每个元素大小
 * @param cmpFn 比对数组元素与target是否相同 相同返回1
 * @return int 查找到的第一个匹配的元素下标,或-1
 */
int search(void* a, size_t size, void* target, 
           size_t elem_size, int(*cmpFn)(void*, void*) )
{
    for(int i=0; i<size; i++) { // 遍历
        if ( cmpFn (a + elem_size * i, target) == 0 ) 
            return i;
    }
    return -1;
}

C++泛型版的代码:

/**
    * @brief 遍历T类型的数组(始末地址 pStart/pEnd)
    *          找到target后返回指向它的指针
    * 
    * @tparam T 模板类 代表各种“类型”
    * @tparam Iter “迭代器”  是一种类似于指针的存在
    * @param pStart 数组起始位置的指针
    * @param pEnd  数组结束位的指针
    * @param target 查找匹配的对象
    * @return Iter 指向数组中target的指针 或NULL
    */
template<typename T, typename Iter>
Iter search(Iter pStart, Iter pEnd, T target) 
{
    for(Iter p = pStart; p != pEnd; p++) {  // p++需要Iter模板自行实现
        if ( *p == target )                 // *p需要Iter模板自行实现
            return p;
    }
    return NULL;
}

在 C++ 的泛型版本中,我们可以看到:
使用typename T抽象了数据结构中存储数据的类型
使用typename Iter,这是不同的数据结构需要自己实现的“迭代器”,由 STL迭代器 基础篇 一文,可知Iter用于 为使用了不同底层实现的STL容器提供统一的遍历接口。

然后,我们对数据容器的遍历使用了Iter中的++方法,这是数据容器需要重载的操作符,这样通过操作符重载也就使遍历操作泛型化。 例如使用 vector::iterator t 可以直接像使用指针t一样遍历vector,而不需要关注vector的实现;底层对链表的访问和数组的访问操作是不同的,但是调用时都可以”++t”去递增。

函数的入参中,pStart和pEnd表示遍历的起止

函数体中,Iter来取得这个“指针”的内容,即“去引用”。这也是通过重载 * 操作符来实现的*。

当然,你可能会问,为什么我们不用标准接口Iter.Next()取代++, 用Iter.GetValue()来取代*,而是通过重载操作符? 其实是为了兼容原有 C 语言的编程习惯。

  • 1
  • +9番茄
  • 739只自习生围观
  • 2021年1月5日 11:20打卡
  • 3 年,3 月前有动静
  • 引用
  • 举报
最近犒劳过的人

  • 亦C
  • 3 年,3 月前
  • 2021年1月5日 11:23
  • 卡主

为了这篇打卡折腾了两天 [😓]
不过 一如既往地,Markdown好评~

作者的近日打卡

猜你喜欢

背诵古诗《行路难》 - 《行路难》是唐代大诗人李白创作的三首七言古诗,选自《李白集校注》,乐府《杂曲歌辞
  • 武嘉源
  • ♂ 19
  • 自律力6.50
  • 乌鲁木齐
  • 高一学生
完成交通工程阅读与笔记 - #完成交通工程阅读与笔记
GTD学习笔记(2) - 整理从大脑中清理出来的事项 , , 第一步:准备 , 找一个至少一小时不受打扰
阅读吧 - 开始看砖头一样的《金翅雀》
linux视频学习之nand flash and lcd硬件接口与使用配置概论 - 学习了arm控制器对nand flash和lcd进行控制的硬件原理和操作步骤
古琴、英语单词和语法,找阅读和写作素材。 - Optional("")
关于模板 - > 在 C++ 语言里,为了同时满足静态类型和抽象,就导致了模板技术的出现 ,
Day2 笔记2 - 上篇字数超了,因为是笔记,内容会有点多。 , 补充: , 1.对于List不需要
Day2 笔记1 - python以前是有基础的,只是后来长期不用就生疏了。又复习加学习了一遍,在B站
Day2 笔记3 - 继续补充: , 1.定义函数: , def square(number): ,

合作伙伴

线上在线自习室晚自习。番茄工作法、四象限、打卡、作业清单、作业辅导、作业交流、作业跟踪、作业计划、个人宣传相关内容

行恒 © 行恒 2013