在当今的编程世界中,泛型编程早已不再是某个语言的独有特性,而是现代编程语言的"标准配置"。就像汽车都需要方向盘和刹车一样,主流编程语言都提供了各自的泛型实现方案。

比如:Java通过泛型实现了类型安全的容器,让你可以写出List<String>这样的代码,编译器会在编译阶段进行类型检查,防止错误的数据类型被放入容器;C#的泛型更是强大,它在运行时仍然保留类型信息,提供了真正的泛型体验。TypeScript作为JavaScript的超集,也引入了泛型概念,为动态语言带来了静态类型的安全感。Rust则以其"零成本抽象"的理念,让泛型在保证安全性的同时,不带来任何运行时开销。

与现代其他语言相比,C++泛型编程的最大特色在于它的零开销抽象原则。这意味着使用模板不会带来任何运行时性能损失,生成的代码与手写特定类型的代码同样高效。这种设计哲学让C++在性能敏感的场景中始终保持不可替代的地位。

随着C++标准的演进,泛型编程也在不断发展。C++11引入了自动类型推导和可变参数模板,C++17带来了类模板参数推导,而C++20的概念(Concepts)特性更是让模板编程如虎添翼,提供了更好的错误信息和更清晰的接口约束。

本节主要复习一下template模板知识,让大家更深刻感受一下C++泛型编程思想。在《什么是C++模板?》我们提到通过template模板来创建通用加法函数,那再复习一遍,写一个冒泡排序看看实力(不熟悉冒泡排序的小伙伴可自行跳转《冒泡排序算法C/C++代码图文讲解》):

#include<bits/stdc++.h>//万能头文件,竞赛通用
using namespace std;
 
template <typename T>
void bubble_sort(T arr[], size_t len)  // len表示数组元素个数
{
    for (size_t i = 0; i < len - 1; ++i)        // 外层循环:控制排序轮数
    {
        for (size_t j = 0; j < len - 1 - i; ++j) // 内层循环:每轮比较相邻元素
        {
            if (arr[j] > arr[j + 1])            // 如果前一个元素大于后一个元素,则交换两个元素的位置
            {
                T temp = arr[j];               
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }     
    }
}
 
void test()//测试你的模板写对没有
{
       int len =5;
       int arr_int[]={3,2,5,1,4};
       double arr_double[]={2.3,0.2,7.4,3.2,0.5};
       bubble_sort(arr_int,len);
       bubble_sort(arr_double,len);
       cout << "int数组排序后belike:\n";
       for(size_t i=0;i<5;++i)cout << arr_int[i]<< " ";
       cout << '\n';
              cout << "double数组排序后belike:\n";
       for(size_t i=0;i<5;++i)cout << arr_double[i]<< " ";
}
int main(){
test();
       return 0;
}

如果你实现了冒泡排序模板,那么恭喜你,你已经初识STL的基本原理了。 

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)