不学STL,无以立。——陈轶阳

从1.1节到1.8节大部分都是从各方面介绍STL,

包括历史之类的(大致上是这样,因为实在看不下去我就直接略到了1.9节(其实还有一点1.8.3的内容))。

第一章里比较实用(能用在自己代码当中)的部分应该就是1.9节可能令你困惑的C++语法这部分了。

而1.9中又分为以下几个小节:

  • 1.9.1 stl_config.h 中的各种组态(configurations)
  • 1.9.2 临时对象的产生和运用
  • 1.9.3 静态常量整数成员在class 内部直接初始化
  • 1.9.4 increment/decrement/dereference 操作符
  • 1.9.5 前闭后开区间表示法 [ )
  • 1.9.6 function call 操作符(operator())

1.9.1 stl_config.h 中的各种组态(configurations)

所谓组态(configurations)这个翻译一开始看得我是很晕……

后来看到configurations才大概知道了是配置、设定、设置的意思。

简而言之就是通过常量设定,

来取舍代码。

不过看了几个看得不是很懂,

所以打算后面的看完了再详细地看这一节(滑稽)。

1.9.2 临时对象的产生和运用

临时对象很常见,

比如值传递(copy by value)的时候就会copy出一个临时对象。

尽管大部分时候临时对象意味着效率会降低,

但有时候故意创造一些临时变量则会使程序变得干净清爽。

而刻意制造临时对象的方法,

则是利用仿函数(1.9.6节的内容)使得在构建一个对象后可将其通过类似函数调用的方式工作,

这时所构建出的对象相当于调用其构造函数(constructor)且没有指定对象名称。

// 一个将临时对象用于for_each()的例子
#include <vector>
#include <algorithm>
#include <iostream> using namespace std; template <typename T>
class print
{
public:
void operator()(const T& elem) // operator()重载,见1.9.6节
{
cout << elem << ' ';
}
}; int main()
{
int ia[6] = {0, 1, 2, 3, 4, 5};
vector<int> iv{ia, ia+6};
for_each(iv.begin(), iv.end(), print<int>());
return 0;
}

这样使用时效果类似于使用模版函数,但是可以确保打印时的元素都是同一种类型。其中for_each用法为for each用法,更多用法请在网络上冲浪,搜索查阅。

1.9.3 静态常量整数成员在class 内部直接初始化

如果class中包含const static integral data member(静态常量整数成员),

那么根据C++标准就可以直接在class之内给予初值,

其中integral则泛指所有整数类型,

不单指int。

// 一个测试class内部直接初始化静态常量整数成员的例子
#include <iostream> using namespace std; template <typename T>
class testClass
{
public:
static const int _datai = 5;
static const long _datal = 3L;
static const char _datac = 'c';
}; int main()
{
cout << testClass<int>::_datai << endl; // 5
cout << testClass<int>::_datal << endl; // 3
cout << testClass<int>::_datac << endl; // c
return 0;
}

1.9.4 increment/decrement/dereference 操作符

即重载自增(decrement)与自减(increment)以及取值(dereference)操作符。

且由于编译器必须能够识别出前缀自增(减)与后缀自增(减),

人为规定了用一个 int 区分,

并没有实际的含义。

// 一个示例定义
#include <iostream> using namespace std; class INT
{
friend ostream& operator<<(ostream& os, const INT& i); public:
INT(int i): m_i(i){}; // prefix: increment and then fetch
INT& operator++(){}; // postfix: fetch and then increment
const INT operator++(int){}; // prefix: decrement and then fetch
INT& operator--(){}; // postfix: fetch and then decrement
const INT operator--(int){}; // dereference
ElemType& operator*() const{}; private:
int m_i;
};

1.9.5 前闭后开区间表示法 [ )

任何一个STL算法,

都需要获得由一对迭代器(泛型指针)所标示的区间,

而这一对迭代器所标示的即是个前闭后开区间,

以[first, last)表示,

first指向第一个元素的位置,

last则指向最后一个元素的下一个位置。

1.9.6 function call 操作符(operator())

即重载函数调用操作符(一对小括号)。如果针对某个class进行operator()重载,它就成为一个仿函数。

// 一个将operator()重载的例子
#include <iostream> using namespace std; template <class T>
struct plus
{
T operator()(const T& x, const T& y) const
{
return x + y;
}
}; int main()
{
plus<int> plusobj; // 产生仿函数对象 // 像一般函数一样使用仿函数对象
cout << plusobj(3, 5) << endl; // 8 // 直接产生临时仿函数对象并调用
cout << plus<int>()(5, 3) << endl; // 8
}

要注意的是重载后的函数调用符是针对实例化对象而不是类

《STL源码剖析》学习半生记:第一章小结与反思的更多相关文章

  1. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  2. c++ stl源码剖析学习笔记(二)iterator

    ITERATOR 迭代器 template<class InputIterator,class T> InputIterator find(InputIterator first,Inpu ...

  3. c++ stl源码剖析学习笔记(三)容器 vector

    stl中容器有很多种 最简单的应该算是vector 一个空间连续的数组 他的构造函数有多个 以其中 template<typename T> vector(size_type n,cons ...

  4. STL源码剖析 学习笔记 MiniSTL

    https://github.com/joeyleeeeeee97 目录: 第二章 空间适配器 第三章 迭代器 第四章 序列式容器(vector,list,deque,stack,heap,prior ...

  5. STL源码剖析-学习笔记

    1.模板是一个公式或是蓝图,本身不是类或是函数,需进行实例化的过程.这个过程是在编译期完成的,编译器根据传递的实参,推断出形参的类型,从而实例化相应的函数 2. 后续补充-.

  6. 《STL源码剖析》学习之traits编程

    侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器 ...

  7. 侯捷STL课程及源码剖析学习1

    1.C++标准库和STL C++标准库以header files形式呈现: C++标准库的header files不带后缀名(.h),例如#include <vector> 新式C hea ...

  8. 侯捷STL课程及源码剖析学习2: allocator

    以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...

  9. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  10. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

随机推荐

  1. win10 安装vb -打开后一直显示无响应-解决

    1.成功安装vb ,美滋滋的运行 ,但是一直卡在无响应状态, 2.解决 使用管理员权限打开即可,也可以更改兼容为win7/8, 神奇的是,我这电脑自用过一次管理员权限打开,后面再使用vb可以不用管理员 ...

  2. 一个高性能跨平台基于Python的Waitress WSGI Server的介绍!

    对于Python来说,它有很多web框架,常见的有jango.Flask.Tornado .sanic等,比如Odoo.Superset都基于Flask框架进行开发的开源平台,具有强大的功能.在Lin ...

  3. Linux基础之终端、控制台、tty、pty简介说明

    最近在搞Linux提权的时候,有时候su 用户名 登录的时候发现登录不了,因为tty终端,交互不了,所以我也来总结一下 一. 基本概念 1. ttytty(终端设备的统称):tty一词源于telety ...

  4. 浅谈xss漏洞

    0x00 xss漏洞简介 XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固定方法, 那么很可能就存在XSS漏洞. 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Scr ...

  5. leetcode 1021. 删除最外层的括号

    问题描述 有效括号字符串为空 ("")."(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的 ...

  6. 【机器学习】VAE

    机器学习算法-VAE 目录 机器学习算法-VAE 1. VAE模型推导 1.1 算法引入 1.2 模型推导 1.3 损失函数 1.4 重参数技巧 2. 实现 2.1 模型定义 2.2 实验 1. VA ...

  7. Windows蓝牙失效超全攻略

    新电脑蓝牙出现问题,我捣鼓了很久,历经九九八十一难得以修复,说一说我在网上看到的各种方法. 一个功能正常使用,需要经过一个又一个的步骤.任何一个地方出问题,都有可能造成蓝牙失效.以下方法按出现概率从大 ...

  8. C# 在PDF文档中应用多种不同字体

    在PDF文档中,可绘制不同字体样式.不同语言的文字,可通过使用Standard字体.TrueType字体.CJK字体或者自定义(私有)等字体类型.下面通过C#程序代码来展示如何实现使用以上类型的字体来 ...

  9. echarts的通用属性的介绍

    通常做数据可视化时,会用到统计图,这里我使用的是Echarts,对于第一次用的人来说,还是有点难度的,主要是里面的属性太多,看的头痛,这里我自己做个笔记 这里的配置项手册里面就是查找各种属性了,在Ec ...

  10. Fastjson反序列化漏洞分析 1.2.22-1.2.24

    Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...