C++标准程序库 8.9分
读书笔记 第2章 C++及其标准程序库简介
上山老人

阅读 第2章 C++及其标准程序库简介 2.2 新的语言特性 2.2.1template 2.2.7 新的型别转换操作符 第4章 4.6 头文件和 第5章 STL,标准模版库 5.2.1序列式容器 5.2.2 关联式容器 5.3 迭代器 5.4 算法 5.4.1 区间 5.5 迭代器之配接器 5.5.1 Insert Iterators 5.5.2 Stream Iterators(流迭代器) 5.5.3 Reverse Iterators(逆向迭代器) 5.6 更易型算法 (Manipulating Algorithms) 5.6.1 移除(Removing)元素 5.6.2 更易型算法和关联式容器 5.6.3 算法 vs 成员函数 5.8 以函数作为算法的参数 5.8.2 判断式(Predicates) 5.9 仿函数(Functors, Function Objects) 5.9.2 预先定义的仿函数 5.10 容器内的元素 5.10.1 容器元素的条件 第6章 6.1容器的共同能力和共同操作 6.2 Vectors 6.5 Sets和Multisets 6.10 细说容器内的型别和成员 5.10.5 直接元素存取 第7章 STL迭代器 7.2 迭代器类型 7.2.6 Vector迭代器的递增和递减 8.1.4 判断式和仿函数 8.2.1函数配接器 14.2 Locales概念 第15章 空间配置器 15.2 程序开发者如何使用配置器 15.3 C++标准程序库的缺省配置器 15.4 使用者自行定义的配置器 15.5 配置器细部讨论

阅读

第2章 C++及其标准程序库简介

2.2 新的语言特性

2.2.1template

  • 因此C++的一般规则是,除了以typename修饰之外,template内的任何标识符号都被视为一个值(value)而非一个型别。

2.2.7 新的型别转换操作符

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
注意,这些操作符都只接受一个参数

static_cast<Fraction>(15, 100) // Oops, creates Fraction (100) Fraction(15, 100) //Fine, creates Fraction(15, 100)

第4章

4.6 头文件和

第5章 STL,标准模版库

5.2.1序列式容器

  • vector
  • deque 发音:类似check [美] ['dek] [英] ['dek]
  • list

5.2.2 关联式容器

通常关联式容器由二叉树(binary tree)实作出来。

  • set
  • multiset
  • map
  • multimap

5.3 迭代器

两种型别:

  • container::iterator
  • container::const_iterator

5.4 算法

  • 头文件 标准模版库的算法头文件,使用的时候需要包含,例如:sort

5.4.1 区间

半开区间(half-open ranges)

[begin, end)

注意:半开区间的意思是end是不包含在范围内的,也就是说begin和end如果都是容器的中的有效元素,end也不在其中。

5.5 迭代器之配接器

  • Insert Iterators(安插型迭代器)
  • Stream Iterators(流迭代器)
  • Reverse Iterators(逆向迭代器) 使用的例子:

copy (coll1.begin(), coll2.end(), // source back_inserter(coll2)); // destination

5.5.1 Insert Iterators

三种类型:

  • Back inserters 提供有push_back()成员函数的容器:vector,deque,list
  • Front Inserters 提供push_front()成员函数的容器:deque,list
  • General inserters 提供insert()成员函数的容器所有STL容器都提供insert()成员函数

5.5.2 Stream Iterators(流迭代器)

5.5.3 Reverse Iterators(逆向迭代器)

5.6 更易型算法 (Manipulating Algorithms)

某些算法会变更目标区间的内容,甚至会删除元素。 体现了STL“为了将容器和算法分离,以获取灵活性”而付出的代价

5.6.1 移除(Removing)元素

然而,迭代器只不过是“容器中某一位置”的抽象概念而已。一般来说,迭代器对自己所属的容器一无所知。 所以,为了达成算法的最大弹性,不要求“迭代器了解其容器细节”还是很多有道理的。

5.6.2 更易型算法和关联式容器

更易型算法:指那些remove元素,重排resort,修改modify元素的算法 关联式容器的基本原则:容器内的元素总是根据某个排序准则自动排序。

5.6.3 算法 vs 成员函数

为了避免槽糕的表现,list针对所有“更易型”算法体统一些对应的成员函数。

5.8 以函数作为算法的参数

5.8.2 判断式(Predicates)

  • 一元判断式(Unary Predicates)
  • 二元判断式(Binary Predicates)

5.9 仿函数(Functors, Function Objects)

行为类似于函数的对象。这种对象称之为Function Object(函数物件),或称Functor(仿函数)

优点:

  • 仿函数是“智能型函数”(smart functions)
  • 每个仿函数都有自己的型别
  • 仿函数通常比一般函数速度快

5.9.2 预先定义的仿函数

  • less<>:比较小于
  • greater<>: 比较大于
  • negate<>:相反值
  • multipites<>:求平方

也终于知道为毛排序算法的默认函数是模版形式了,eg

set<int, greater<int>> col;

5.10 容器内的元素

5.10.1 容器元素的条件

  • 必须可透过copy构造函数进行复制。 副本与原本必须相等
  • 必须可以透过assignment操作符完成赋值动作。
  • 必须可以透过析构函数完成销毁动作。
注意:auto_ptr就不能用了,auto_ptr进行拷贝和赋值动作之后,不是被拷贝了,而是被转移了。

第6章

6.1容器的共同能力和共同操作

C++规则下面两种写法,视为表达式和声明:

  • 表达式:

std::deque<int>c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>()));

  • 声明:

std::deque<int>c(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());

只要加上一堆括号,便可使参数(std::istream_iterator(std::cin))不再符合声明语法

6.2 Vectors

  • 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效

6.5 Sets和Multisets

所谓的“排序准则”,必须定义strict weak ordering,其意义如下:

  1. 必须是“反对称的(antisymmetric)” 对operator<而言,如果x<y为真,则y<x为假。
  2. 必须是“可传递的(transitive)” 对operator<而言,如果x<y为真且y<z为真,则x<z为真。
  3. 必须是“非自反的(irreflexive)” 对operator<而言,x<x永远为假。

6.10 细说容器内的型别和成员

5.10.5 直接元素存取

  • refrence container::at(size_type idx) 如果传入一个无效索引,会导致out_of_range异常
  • refrenct container::operator[](size_type idx) 如果传入一个无效索引,会导致未定义的行为。所以调用者必须确保索引有效,否则应该使用at()。

第7章 STL迭代器

7.2 迭代器类型

7.2.6 Vector迭代器的递增和递减

一般而言你可以递增或递减暂时性迭代器,但对于vectors和strings就不行

std::vector<int> coll; ... // sort, starting with the second element // - NONPORTABLE version if (coll.size() > 1){ sort(++coll.begin(), coll.end()); }

原因:vector的迭代器通常被是作为一般指针。

c++不允许你修改任何基本型别(包括指针)的暂时值,但对于struct和class则运行。

理解:右值不能被修改

8.1.4 判断式和仿函数

你不应该传递一个“行为取决于被拷贝次数或被调用次数”的仿函数。

8.2.1函数配接器

bind2nd

``` ## 第8章 仿函数 ## 第9章 STL算法 ### 9.2 算法概览 #### 9.2.1 简介 > 注意:判断式不应该在函数调用过程中改变其自身状态 #### 9.2.2 算法分门别类 > 注意:关联式容器的元素被视为常数,惟其如此,你才不会在变动元素的时候有任何可能违反整个容器的排序准则。因此,你不可以将关联式容器当作变动性算法的目标区间。 ### 9.5非变动性算法 * 搜寻某些袁术的第一次出现地点 find_first_of base()函数 #### 9.5.4 区间的比较 * 检验相等性(equal) * 搜寻第一处不同点(mismatch) ### 9.6 变动性算法 ### 9.7 移除性算法 remove remove_if * op不应该在函数调用过程中改变自身状态。详见8.1.4 * 注意,remove_if()通常会在内部复制它所获得的那个一元判断式,然后两次运用它。如果该一元判断式在函数调用过程中改变状态,就可能导致问题。细节见8.1.4 * 由于会发生袁术变动,所以这些算法不可用于关联式容器,erase() * Lists提供了一个等效成员函数remove():不是重新赋值元素 ### 9.8 变序性算法 ### 9.9 排序算法 > 注意:对全体元素进行一次性排序,通常比始终维护他们保持已序状态来的高效一些。 #### 9.9.4 Heap算法 ### 9.10 已序区间算法 * 较之无序区间,有着明显的性能优势(通常是对数,不再是线性) * 即使迭代器不是随机存取型,也可以使用。不过复杂度会将为线性 * 大部分实作版本对于无序序列也有效,但如果倚仗这个事实,程序将不具有移植性(最好别倚仗) #### 9.10.1 搜寻元素 * binary_search * includes * lower_bouond * upper_bound * equal_range #### 9.10.2 合并元素 * merge * set_union * set_intersection * set_difference * set_symmetric_difference * inplace_merge ### 9.11 数值算法(Numeric Algorithms) ## 第10章 特殊容器 容器配备器 * Stacks * Queues * Priority queues ### 10.1 Stacks(堆栈) * 设置内部存放元素所用的实际容器 ### 10.2 Queues(队列) ### 10.3 Priority queues(优先队列) * 头文件:#include <queue> ### 10.4 Bitsets * #include<bitset> ## 第11章 Strings(字符串) ### 11.1 动机 * string::size_type * string::npos > 注意:应该使用string::size_type型别而不是int或unsigned。否则上述string::npos的比较动作将无法有效运行 * 字符串索引 代码:

for (int i = endIdx-1; i>=static_cast(begIdx); –i) { cout << line[i]; }

> 如果忘记将begIdx转为int,程序可能会陷入无限循环中, i>=begIdx永远为true。因为如果begIdx为0,而任何无正负号值都大于等于0。 ### 11.2 #### 11.2.4 Strings 和C-Strings > 在string中,字符'\0'和其他字符的地位完全相同 一般而言,整个程序中你应该坚持使用strings,直到你必须将其内容转换为char*时才把它们转换为C-String。 > **c_str()和data()的返回值有效期在下一次调用non-const成员函数即告终止。** 代码实例:

#### 11.2.10 I/O操作符 * std::getline接受参数作为分行符号

getline(std::cin, s, ':');

#### 11.2.12 数值npos的意义 > **npos被设计为-1** ## 第12章 数值(Numerics) ### 12.1 复数(Complex Numbers) ### 12.2 Valarrays 数值线性序列 ## 第13章以Stream Classes完成输入和输出 头文件<iosfwd> ### 13.5 标准I/O函数 #### 13.5.1 输入用的成员函数 get可以读取new line或EOF的。 ### 13.6 #### 13.6.2 使用者自定义操控器 ### 13.7 格式化 ### 13.10 连接Input Streams和Output Streams * tie() * 意味着两者的缓冲区是相同的 #### 13.10.2 以stream缓冲区完成“紧耦合”(Tight Coupling) * rdbuf 返回一个指针,指向stream缓冲区 #### 13.10.3 将标准Streams重新定向(Redirecting) #### 13.10.4 用于读写的Streams ### 13.11 String Stream Classes ### 13.13 Stream Buffer Classes ## 第14章 国际化 ### 14.1 不同的字符编码 #### 14.1.2 字符特性(Character Traits)

namespace std{ template{ … }; } ```

14.2 Locales概念

第15章 空间配置器

它代表一种特定内存模型(memory model)

15.2 程序开发者如何使用配置器

原始储存区的迭代器

临时缓冲区 get_temporary_buffer() return_temporary_buffer()

15.3 C++标准程序库的缺省配置器

  • rebind 这个template使得任何配置器可以间接为其他型别分配空间

15.4 使用者自行定义的配置器

例子: http://www.josuttis.com/libbook/examples.html

15.5 配置器细部讨论

0
《C++标准程序库》的全部笔记 34篇
豆瓣
免费下载 iOS / Android 版客户端