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] 多线程下使用容器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

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