模版介绍与STL六大组件

0 引言

本文主要介绍C++中模版和stl六大组件。理解模版有助于更好的理解stl六大组件,乃至整个stl。

1 模版介绍

引言

谈起模版也许没多少人敢说自己懂,同理,本文作者也不是相应的高手。虽然在大家的映像中,模版很难把握,但我们仍然需要克服恐惧,去面对与攻克它。

模版的学习成本较高,那么为什么要了解模版呢?

模版可以说是stl的大门,也是泛型编程的基础。学习模版可以让自己对于C++的学习更加自信,也能在面试的时候更加胸有成竹。

本部分仅仅总结本人自己所学,不能覆盖模版的各个细节,但尽量将相应的重点总结出来,以能帮助大家理解。

同时也欢迎大家一起讨论,欢迎拍砖!

模版基本概念

模版是什么

参考C语言中的宏的概念,在一定程度上可以将模版类比与C语言中的宏;

当然,更官方的说法–模版是一种代码生成器,可以在编译期生成你想要的代码。

在C++中,模版一般会涉及到函数模版类模版

首先看下函数模版的定义,如下定义一个qtmp函数模版

template <typename T>
T qtmp(T val) {
    return val;
}

模版定义需要由关键词template开始,<>中为模版参数列表,其可由一个或多个模版参数组成,参数之间由","分割。

注:模版参数列表不能为空

模版参数列表可类比函数参数列表,与函数参数列表不同的是模版参数列表的输入范围更局限(用户自定义类型,以及C++内嵌类型)。

有了模版函数定义,那么在代码中如何使用呢?其使用方式如下

auto val = qtmp(2); // T推导为int

该过程叫做模版实例化。关于上述模版参数类型推导,将在模版进阶中讲解。

类模版–类代码生成器。在C++17之前,不能通过类构造函数推断模版参数类型,但C++17开始,便可由类构造函数推断类模版参数类型。

定义qcpp类模版如下

template <typename T>
class qtmp {
private:
    T val_;
public:
    qtmp(const T& val) : val_ {}

    template <typename U>
    T add(const U& val) {
        return val + val_;
    }

    void sub(const T& val);
};

通过该类模版的定义可以得出:类模版的构造函数可以直接使用类模版名(qtmp), 类模版成员函数也可以定义模版函数。

上述sub函数未在类模版中定义,我们可以在类模版之外进行定义,其语法如下

template <typename T>
void qtmp<T>::sub(const T& val) {
    val_ -= val;
}

同模版函数一样,可以通过如下方式使用类模版

qtmp<std::string> qt;

qtmp qt; // 此种用法错误

如果使用qtmp,则会报错,这是因为qtmp并不是某种类型,qtmpstd::string 才是类的实例化。

注:一般情况下,类模版模版成员函数只有在使用到时才会被实例化

为什么说一般情况下呢?

模版只有被使用的时候才会实例化,因此如果多个文件实例化了同样的类模版,则此时每个文件就会有该模版的一个实例。这会造成代码的膨胀以及二进制文件膨胀。

因此针对此种情况,可以通过显示实例化来解决。一个显示实例化有如下形式

extern template declaration; // 实例化声明
template declaration;   // 实例化定义

declaration是一个类或者函数声明,其中所有模版参数已被替换为模版实参。 譬如,

extern template qtmp<std::string>;

当编译器遇到extern模版声明时,它不会在本文件中生成实例化代码。extern承诺在程序其他位置有该实例化的一个非extern声明(定义),且该定义必须只有一个。

注:extern声明必须出现在任何使用此实例化版本的代码之前

对于每个实例化声明,在程序中某个位置必须有其显式的实例化定义,显示实例化定义会实例化所有成员。

模版进阶

编译过程

模版偏特化与特化

模版参数推导

变参模版

2 STL六大组件

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qls315

感觉好可打赏几毛钱增强更新动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值