Effective STL - 引言

揭开使用STL时各 陷阱的 来源 / 解决方案的优劣

接口与实现分离: 对于STL, 不能简单地使用这条规则
原因: STL实现的 通用&特殊性

关联容器: 有更多陷阱

6大部件
函数对象: 增强算法的 扩展性

STL库

(1) 是1个模板库

[1] 编译器对于模板的支持各不相同 => 可移植性问题

[2] 小用法错误, 导致大量编译器诊断信息 -> 简化 -> 错误提示清晰

(2) 代表了 效率和扩展性 程序设计突破

引言

1 本书
(1)
如何 综合STL各个部分, 以充分利用STL库的设计

这可以帮助我们 为简单而直接/复杂的问题设计出简单而直接/优雅 的解决方案

(2) 指出常见STL用法错误, 如何避免

2 定义、使用和扩展STL

本书对STL的定义 不包括标准C++库的扩展部分

, 尤其是 散列容器、单向链表、rope, 非标准函数对象
  1. STL平台: 一个 特定编译器和一个 特定STL实现 的组合

  2. 引用计数(RC: reference count)

指针容器 设计 几乎都会用到 RC

很多 string 实现 也使用 RC

  1. string 和 wstring 是同一个模板 basic_string 的不同实例

本文所说的适用于string的内容也适用于wstring

  1. 术语

(1) 容器

标准序列/关联容器

vector string deque list /
set multiset map multimap

(2) 5种迭代器

[1/2] inputIter/outputIter
只读/写
遍历到的位置上只能被读/写一次

输入/出迭代器模型分别建立在针对输入/出流(如文件)的读/写操作的基础上

最常见的表现形式是 istream_iterator/ostream_iterator

[3] 前向
1] 兼具输入和输出迭代器的能力
2] 可对同一位置 重复读/写

所有标准STL容器都支持比前向迭代器功能更强大的迭代器

散列容器的一种设计(25条)产生 前向迭代器

单向链表容器提供前向迭代器

[4] 双向

标准关联容器 都提供

[5] 随机

迭代器算术

string vector deque 都提供
数组内部指针之于数组

(3) functor 函数子/仿函数

重载了函数调用操作符 operator()(.) 的类

其创建的对象称 函数对象

STL中 大多使用函数对象的地方也可以使用函数, 所以常用 函数对象 既表示 函数, 也表示 函数对象

(4) bind1st bind2nd

绑定器/binder

(5) 计算复杂性保证

STL革命性的方面

限制了一个STL操作可以做多少工作

n: 容器/区间中 元素个数

[1] 常数时间

插入 list

非字面上的常数, 只意味 所需时间不受n的影响

变种: 分摊的常数时间

通常是常数时间, 偶尔花费与n相关

[2] 对数时间

一百万个元素是百个元素耗时的三倍

log n^3=3 logn

关联容器 大多数查找算法(如 set::find)

[3] 线性时间

对所给区间中的每个元素都要 check
count

n足够大时 常数时间快于对数时间快于线性时间

较小的n, 有时理论上更复杂的操作反而会比理论上更简单的操作性能更好
  1. map或multimap

每个元素有两部分 key 和 value

  1. 代码例子

(1) 从属类型 typename

(2) 参数名: lhs/rhs
左手一边”和“右手一边”

(3) 类名 Widget
与GUI / 具体的工具箱 没任何关系
指 “完成某些功能的某个类”

(4) 不会引起混淆时, 不区分类和类模板/ 函数和函数模板

与效率相关的条款-虚设的章节

item4 用 empty()而非 size()=0

item5 区间成员函数 优先于相应的 单元素成员函数

item14 用 reserve() 避免不必要的重新分配

item15 注意 string 实现的多样性

item23 考虑用 排序的vector 代替关联容器

item24 效率至关重要时, 要在map::operator[] 间 map::insert 正确选择

item25 熟悉 非标准散列容器

item29 逐字符输入考虑 istreambuf_iterator

item31 排序选择

item44 容器的成员函数 优先于同名算法

item46 算法参数考虑函数对象而非函数

Note 本书条款只是指导原则, 有一定的使用条件

有些条件下, 违反它们也是合理的

如 item7: 容器析构前要delete 容器中new的指针

前提: 指针指向的对象不再需要 时才这样

STL容器

动态增/缩
自己管理内存
记住自己包含了多少对象
限定了自己所支持的操作的复杂性

本章讲 适用于所有STL容器的准则

[1] 如何就所面临的制约条件 选容器类型

[2] 避免一种错误认识: 同一代码可用于不同容器

[3] 对容器中的对象, copy 操作的重要性

[4] 指针/auto_ptr 容器的困难

[5] 删除操作细节

[6] 定制的分配子 能做什么不能做什么

[7] 多线程下使用容器

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • item1 慎重选择容器类型 1 STL容器分类 另一种分类方法: 连续内存/基于节点 的容器 (1) 连续内存容...
    my_passion阅读 2,405评论 0 1
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 5,346评论 0 10
  • 第一章.容器 条款1.慎重选择容器类型 标准STL序列容器:vector、string、deque和list标准S...
    JeremyYv阅读 3,647评论 0 1
  • 容器 条款1:仔细选择你的容器 C++提供了很多可供程序员使用的容器:(1) 标准STL序列容器:vector,...
    lintong阅读 4,346评论 0 3
  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 9,767评论 0 9