Effective C++ 49,50
49.熟悉标准库。
C++标准库非常大。
首先标准库中函数非常多,为了避免名字冲突。使用命名空间std。而之前的库函数都存放于< .h>中,如今成为伪标准库。而不能直接将这些头文件所有直接加入命名空间,标准委员会仅仅能又一次创建了不带.h的头文件。对于C中头文件採用相同的方法,可是每一个名字前加入一个c。如C中的<string.h>变成了<cstring>。旧的c++头文件是官方反对使用的,但旧的c头文件不是,为了保持对C的兼容性。
如 <string.h>是旧的C头文件,相应的是基于char*的字符串处理函数,<string>是包括了std的C++头文件。相应的是新的string类,而<cstring>是C头文件的std版本号,但这里没有string类的旧c++版本号,由于官方不推荐这样做。
第二。库中差点儿都是模版。如iostream,操作字符流。流类实际就是类模版,在实例化流类的时候指定字符类型。
即使是string,事实上也是一个模版。类型參数限定了每一个string类中的字符类型。string的类型声明是:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
这里的字符类型与之前iostream中的字符类型是一个意思,它不是指char,指的是一个流中的字符,这里字符类型确定其參数,字符类型指的是字符集。由于不同的字符集在实现的细节上不同,如特殊的文件结束字符。拷贝他们的数组的最有效方式等。这些特征在标准中被称为traits。然后还有string对象运行动态内存分配的方法,使用一个Allocator參数。而Allocator类型的对象被用来分配和释放string对象的内存,其是一个内存管理器。不要手动的声明标准库中的不论什么部分。
Iostream。和传统的Iostream相比。它已经被模版化,继承层次结构也进行了改动。添加了抛出异常的能力。支持string(通过stringstream)和国际化(通过locales)。
新的Iostream能够将string和文件当作流,还能够对流的行为做更广泛的控制,包含缓存和初始化。
容器。标准库中提供了一下的高效实现。vector,list,queue,stack,deque,map,set和bitset。string是容器。对容器的不论什么操作都适用于string。标准库的实现是高效的。使用容器能够消除动态分配内存造成的内存泄漏。
算法,标准库中提供了大量的简易方法,称为algorithm,实际为函数模版。当中大多数适用于库中全部容器以及内建数组。算法将容器的内容作为序列,每一个算法能够应用与一个容器中全部值相应的一个序列。或者一个子序列。
标准算法有,for_each 为序列中的每一个元素调用某个函数。 find 在序列中查找包括某个值的第一个位置, count_if 计算序列中满足某个判定为真的元素的数量。equal 推断两个序列包括的元素的值是否全然相等,search 在一个序列中找出某个子序列的起始位置,copy 拷贝一个序列到还有一个,
unique 在序列中删除反复值, rotate 旋转序列中的值,sort 对序列中的值排序。等等。和容器操作一样,算法也有性能保证。
对国际化的支持。提供有助于开发出国际化软件的特性。支持国际化的最基本的构件是facets 和 locales 。
facets描写叙述的是对一种文化要处理哪些特性。包含排序规则(即某些地区字符集中的字符应该怎样排序),日期和时间应该怎样表示,数字和货币值应该怎样表示。怎样将信息表示符映射成明白的语言信息,等等。locales 将多组facets捆绑在一起,facets是指前面说到的那些特性中的一个,而locales 表示多个facets组成的一个对于某个国家的规则,若一个locales表示美国人是怎样解决前面几个问题的。
对于数字处理的支持。C++库中为复数类和专门针对数值编程而设计的特殊数组提供了模版。如valarray 类型的对象能够用来保存能够随意混叠的元素,
诊断支持。标准库支持三种报错方式:C的断言。错误号,例外 exception 。例外先派生出 logic_error 和 runtime_error ,然后再有这两个类派生出详细的错误类型。logic_error 表示软件中的逻辑错误,理论上能够通过更细致的程序设计来防止。runtime_error 类型的例外为执行时才干发现的错误。
标准库中的容器和算法这部分一般被称为标准模版库 STL 。
STL是标准库中最具创新的部分,它的体系结构具有扩展性。依照STL中的规范,能够进行非常多扩展。
50.提高对C++的认识。
C++设计时的首要目标:与C的兼容性。效率,和传统开发工具及环境的兼容性,解决真实问题的可应用性(即面向对象)。
以上目标阐明了C++语言中大量的实现细节。如,为什么隐式生成的拷贝构造函数和赋值运算符要像如今这样工作,尤其是指针产生的浅拷贝问题?由于这是C对struct的拷贝和赋值的方式,要与C兼容。为什么析构函数不自己主动声明为virtual,为什么实现细节必须出如今类的定义中?由于不这样做会带来性能上的损失。效率非常重要。为什么C++不能检測非局部静态对象间的初始化依赖关系?由于C++支持单独编译(即,分开编译源模块。然后将多个目标文件链接起来,形成可运行程序),依赖现有的链接器。不会程序数据打交道,所以c++编译器差点儿不可能知道整个程序的一切情况。为什么C++不让程序猿从一些繁杂事务如内存管理和低级指针操作中解脱出来?由于一些程序猿须要这些处理能力,一个真正的程序猿的须要自关重要。
Effective C++ 49,50的更多相关文章
- hdu 3555 Bomb(不要49,数位DP)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- 【转】最全的 pip 使用指南,50% 你可能没用过
[转]最全的 pip 使用指南,50% 你可能没用过 所有的 Python 开发者都清楚,Python 之所以如此受欢迎,能够在众多高级语言中,脱颖而出,除了语法简单,上手容易之外,更多还要归功于 P ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器
首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...
- Nginx 灰度实现方式(支持纯灰度,纯生产,50度灰及更多比例配置)
前言 Nginx相关技术短信本篇幅不做详细介绍,所以学习本文之前要对Nginx有相关的了解. 生产环境即线上环境,在经历开发.测试再到上线,不可避免的会更新生产环境,但谁又能保证测试过的代码到线上运行 ...
- Effective C++ 35,36,37
35.使公有继承体现 "是一个" 的含义. 共同拥有继承意味着 "是一个".如 class B:public A. 说明类型B的每个对象都是一个类型A的对象, ...
- Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?
Spring Boot2 系列教程接近完工,最近进入修修补补阶段.Freemarker 整合貌似还没和大家聊过,因此今天把这个补充上. 已经完工的 Spring Boot2 教程,大家可以参考这里: ...
- Web调优之IBM JDK+liberty(一): Jmeter pod里压力,50个线程并发测试,调整 -Xms -Xms, Log原来是大问题
1.运行环境 k8s Web服务器: Liberty(IBM J9 JDK),base image : FROM websphere-liberty:20.0.0.3-kernel-java8-ibm ...
- [Effective JavaScript 笔记]第50条:迭代方法优于循环
"懒"程序员才是好程序员.复制和粘贴样板代码,一但代码有错误,或代码功能修改,那么程序在修改的时候,程序员需要找到所有相同功能的代码一处处进行修改.这会使人重复发明轮子,而且在别人 ...
随机推荐
- Orchard FAQ
Orchard学习视频已登录百度传课: http://www.chuanke.com/3027295-124882.html 问:Orchard用VS重新生成后为什么那么大? 答:因为每个模块的bin ...
- Microsoft SQL Server Version List [sqlserver 7.0-------sql server 2016]
http://sqlserverbuilds.blogspot.jp/ What version of SQL Server do I have? This unofficial build ch ...
- SQL Server 2005 系统数据介绍:dm_exec_connections
原文:SQL Server 2005 系统数据介绍:dm_exec_connections 转载:http://msdn.microsoft.com/zh-cn/library/ms181509(SQ ...
- vs2015安装VAssistX以后,去除中文注释会有红色下划线方法
---恢复内容开始--- 环境:Visual Studio 2015 问题:代码中出现中文后会带下划线,不舒服-----解决办法. 1.安装完Visual Assist X后会在VS2015的菜单栏出 ...
- JWT笔记(2)
上文对JWT模块进行了一个简单的分析.这篇文章稍微做出一些深入的了解. 一,Header篡改攻击 因为JWT的Header是强制有效并且是明文传输(Base64URL编码,几乎等同于明文).那么恶意用 ...
- 文本文件打印类库(C#)
我写了一个打印文本文件的类库,功能包含:打印预览.打印.打印时能够选择打印机.能够指定页码范围. 调用方法很easy: TextFilePrinter p = new TextFilePrinter( ...
- GROUP BY和HAVING 以及mysql中常用的日期函数
一.mysql中的GROUP BY和HAVINGGROUP BY常见的是和聚合函数(SUM,MIN,MAX,COUNT)搭配使用. 比如:SELECT category,SUM(money) AS ` ...
- object-c 框架之经常使用结构体
Foundation 框架定义经常使用结构体.结构体採用object-c 定义:经常使用NSSRange,NSPoint.NSSize,NSRect等 一.NSRange 创建范围结构体. 方法:NS ...
- POJ 3687:Labeling Balls(优先队列+拓扑排序)
id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10178 Acc ...
- java jdk 环境变量设置
我的电脑点右键,选择“属性”,选择“高级”标签,进入环境变量设置,分别设置如下三个环境变量: 设置JAVA_HOME: 一是为了方便引用,比如,JDK安装在C:\jdk1.6.0目录里,则设置JAVA ...