类模板

题目描述:实现StrBlob的模板版本。

  1. /* Blob.h */
  2. #include<iostream>
  3. #include<vector>
  4. #include<initializer_list>
  5. #include<memory>
  6. using namespace std;
  7.  
  8. template <typename T> class Blob {
  9. public:
  10. typedef typename vector<T>::size_type size_type;
  11. Blob();
  12. Blob(initializer_list<T> il);
  13.  
  14. size_type size() const { return data->size(); }
  15. bool empty() const { return data->empty(); }
  16. void push_back(const T &t) { data->push_back(t); }
  17. void push_back(T &&t) { data->push_back(std::move(t)); }
  18.  
  19. T& back();
  20. T& front();
  21. T& operator[](size_type i);
  22. private:
  23. shared_ptr<vector<T>> data;
  24. void check(size_type i, const T &msg);
  25. };
  26.  
  27. template <typename T>
  28. Blob<T>::Blob(): data(make_shared<vector<T>()) {}
  29.  
  30. template <typename T>
  31. Blob<T>::Blob(initializer_list<T> il): data(make_shared<vector<T>>(il)) {}
  32.  
  33. template <typename T>
  34. void Blob<T>::check(size_type i, const T& msg)
  35. {
  36. if (i >= data->size())
  37. throw out_of_range(msg);
  38. }
  39.  
  40. template <typename T>
  41. T& Blob<T>::back()
  42. {
  43. check(, "back on empty Blob");
  44. return data->back();
  45. }
  46.  
  47. template <typename T>
  48. T& Blob<T>::front()
  49. {
  50. check(, "front on empty Blob");
  51. return data->front();
  52. }
  53.  
  54. template <typename T>
  55. T& Blob<T>::operator[](size_type i)
  56. {
  57. check(i, "subscript out of range");
  58. return (*data)[];
  59. }

【C++ Primer 第六章】 1. 定义模板的更多相关文章

  1. 【C++ Primer 第7章】定义抽象数据类型

    参考资料 1. C++Primer #7 类 Sales_data类 Sales_data.h #include<iostream> #include<string> clas ...

  2. 【C++ Primer 第16章】2. 模板实参推断

    模板实参推断:对于函数模板,编译器利用调用中的函数实参来确定模板参数,从函数实参来确定模板参数的过程被称为模板实参推断. 类型转换与模板类型参数 与往常一样,顶层const无论在形参中还是在是实参中, ...

  3. C++Primer 第六章

    //1.我们通过调用运算符来执行函数.调用运算符的形式是一对圆括号,他作用于一个表达式,该表达式是一个函数或者指向函数的指针.圆括号之内是用逗号分隔的实参列表,用于初始化函数形参.调用表达式的类型就是 ...

  4. 【C++ Primer 第15章】定义派生类析构函数

    学习资料 • 基类和派生类析构函数执行顺序 定义派生类析构函数 [注意]定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数 ...

  5. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  6. WP8.1学习系列(第二十六章)——控件模板

    在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果 ...

  7. 精读《C++ primer》学习笔记(第四至六章)

    第四章: 重要知识点: 4.1 基础 函数调用是一种特殊的运算符,它对运算对象的数量没有限制. 重载运算符时可以定义运算对象的类型,返回值类型,但运算对象的个数,运算符的优先级,结合律无法改变. 当一 ...

  8. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

  9. 【C++】《C++ Primer 》第十六章

    第十六章 模板与泛型编程 面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况. OOP能处理类型在程序允许之前都未知的情况. 泛型编程在编译时就可以获知类型. 一.定义模板 模板:模板是泛型编 ...

随机推荐

  1. Hive记录-部署Hive环境

    1.配置 hive1.2.0(前提要配置hadoop2.7.2,前面文档有介绍) #官网下载二进制包,解压到/usr/app 下,配置/etc/profile: export HIVE_HOME=/u ...

  2. CM记录-集群主机存储情况

  3. 词典的实现(1)--Map的底层实现

    1,词典是这样的一种数据结构:它能根据给定的键(索引值,key)来查找其对应的值(value)是否存在,在JAVA中主要由java.util.HashMap来完成该功能.如电话本就是词典的一个具体实例 ...

  4. JavaScript常用函数总结

    1.test()方法 var str = "wzltestreg"; var reg = new RegExp("wzl", ""); al ...

  5. Linux 4.10.8 根文件系统制作(一)---环境搭建

    一.工具 制作工具为busybox 下载地址:https://busybox.net/ 解压: 二.制作文件系统 进入目录,执行make menuconfig: 2.1 busybox setting ...

  6. div背景半透明

    例子: html: <div class="erp-mask-a" > <div class="erp-mask-cell-a"> he ...

  7. SpringBoot拦截器的注册

    (1).编写拦截器 package cn.coreqi.config; import org.springframework.util.StringUtils; import org.springfr ...

  8. CSS在项目中常用的属性总结

    1.媒体查询 2.如何快速生成适配各种浏览器的属性. 3.全面进军移动app开发.

  9. 跟踪OceanLotus的新下载程序KerrDown

    攻击的方法 两种方法将KerrDown下载器传递给目标.一个是使用带有恶意宏的Microsoft Office文档,另一个是包含带有DLL side-loading合法程序的RAR存档 .对于RAR存 ...

  10. 【Python】【辅助程序】练手小程序:记录外网动态IP地址

    练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口       http://bbs.125.la/thread-1383897 ...