《STL源码剖析》学习半生记:第一章小结与反思
不学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源码剖析》学习半生记:第一章小结与反思的更多相关文章
- c++ stl源码剖析学习笔记(一)uninitialized_copy()函数
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...
- c++ stl源码剖析学习笔记(二)iterator
ITERATOR 迭代器 template<class InputIterator,class T> InputIterator find(InputIterator first,Inpu ...
- c++ stl源码剖析学习笔记(三)容器 vector
stl中容器有很多种 最简单的应该算是vector 一个空间连续的数组 他的构造函数有多个 以其中 template<typename T> vector(size_type n,cons ...
- STL源码剖析 学习笔记 MiniSTL
https://github.com/joeyleeeeeee97 目录: 第二章 空间适配器 第三章 迭代器 第四章 序列式容器(vector,list,deque,stack,heap,prior ...
- STL源码剖析-学习笔记
1.模板是一个公式或是蓝图,本身不是类或是函数,需进行实例化的过程.这个过程是在编译期完成的,编译器根据传递的实参,推断出形参的类型,从而实例化相应的函数 2. 后续补充-.
- 《STL源码剖析》学习之traits编程
侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了. 之前已经介绍过迭代器 ...
- 侯捷STL课程及源码剖析学习1
1.C++标准库和STL C++标准库以header files形式呈现: C++标准库的header files不带后缀名(.h),例如#include <vector> 新式C hea ...
- 侯捷STL课程及源码剖析学习2: allocator
以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
1 STL迭代器原理 1.1 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...
- 《STL源码剖析》相关面试题总结
原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...
随机推荐
- etcd的raft选取机制
etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠, ...
- vue iview element-ui兼容IE11浏览器
首先安装babel-polyfill npm install babel-polyfill --save-dev 入口文件引用,在main.js中引用 import 'babel-polyfill' ...
- Whitelabel Error Page错误原因
前言: 今天在做项目中遇到了一个问题,项目启动成功,但是前段访问接口始终访问不成功,页面一直在404,百度了一番无非两种解决方案: 一.解决方案 1.项目是boot项目查看启动类的位置是否放置正确 要 ...
- Easticsearch概述(ES、Lucene、Solr)一
ES是在Lucene的基础上实现的 1.Lucene全文检索 lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/或goolge Destop 那么拿 ...
- CAX软件资产管理
CAX软件其实指的是计算机辅助设计软件统称,即CAD.CAM.CAE.CAPP.CAS.CAT.CAI等各项技术的综合叫法,因为这些技术的缩写基本都是以CA为起始,X则表示所有.也就是说,CAX实际上 ...
- 【reverse】逆向3 寻找地址
[reverse]逆向3 寻找地址 寻址公式一:[立即数] 读取内存的值: mov eax,dword prt ds:[0x13FFC4] 将内存编号为0x13FFC4.0x13FFC5.0x13FF ...
- 微服务架构 | 2.2 Alibaba Nacos 的统一配置管理
目录 前言 1. Nacos 配置中心基础知识 1.1 Nacos 在配置中心中的功能 1.2 Nacos 配置管理 Data ID 的构成 1.3 Nacos 配置的回滚机制 1.4 Nacos 配 ...
- 面渣逆袭:Java基础五十三问,快来看看有没有你不会的!
大家好,我是老三, 面渣逆袭 系列继续.这节我们回到梦开始的地方--Java基础,其实过了萌新阶段,面试问基础就问的不多,但是保不齐突然问一下.想一下,总不能张口高并发.闭口分布式,结果什么是面向对象 ...
- 通过kubeadm工具部署k8s集群
1.概述 kubeadm是一工具箱,通过kubeadm工具,可以快速的创建一个最小的.可用的,并且符合最佳实践的k8s集群. 本文档介绍如何通过kubeadm工具快速部署一个k8s集群. 2.主机规划 ...
- WEB前端基础之SCC(字体颜色背景-盒子模型)
目录 一:伪元素选择器 1.首字调整>>>:也是一种文档布局的方式 2.在文本的前面通过css动态渲染文本>>>:特殊文本无法选中 3.在文本的后面通过css动态渲 ...