Skip to content

Commit 94a2d7d

Browse files
committed
Update public notes
1 parent b4c33d8 commit 94a2d7d

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

content/编程相关/编程语言/Cpp 之旅 第三版 读书笔记.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,4 +1149,56 @@ vecotr<double> v4(32, 9.9); // 尺寸 32, 初始值 9.9
11491149

11501150
> 标准库vector非常灵活且高效,应当将它作为默认容器。也就是说,除非有充分的理由使用其他容器,否则应使用vector。如果你的理由是“效率”,请进行性能测试一一我们在容器使用性能方面的直觉通常是很不可靠的。
11511151
1152+
### list
1153+
1154+
> 标准库提供了名为 list 的双向链表。
1155+
1156+
用链表时,通常不会像用数组那样用它,也就是说不常用下标操作访问,而是搜索给定值。所以链表也可以用范围 for 遍历。
1157+
1158+
> 上面这些 list 的例子都可以等价地写成使用 vector 的版本,而且令人惊讶的是(除非你了解机器的体系架构),vector 的性能经常会优于 list。当想要一个元素序列时,我们面临 vector 与 list 之间的选择。但除非你有充分的理由选择list,否则就应该使用 vector。vector 无论是遍历(如,find()和count())性能还是排序和搜索(如,sort()和 binary_search(),13.5节、15.3.3节),性能都优于list。
1159+
1160+
*不太懂为啥,我猜也许是因为连续存储易于随机访问和修改导致的吗,而 vecotr 顺序访问则会因为连续而被机器优化执行所以相同甚至更高性能。不论如何,说的大概率是非常有道理和有用的话。*
1161+
1162+
### forward_list
1163+
*经典的单向链表。*
1164+
1165+
单向链表。
1166+
1167+
这个设计的目的是为了比 list 更省空间,但是只允许向前迭代。
1168+
1169+
### map
1170+
*原来 map 底层是平衡二分搜索树而不是散列表。*
1171+
1172+
> 标准库提供了名为 map 的平衡二分搜索树(通常是红黑树)。
1173+
1174+
map 也被称为关联数组或字典。
1175+
1176+
```cpp
1177+
map<string, int> phone_book {
1178+
{"Tom", 123};
1179+
{"Ammy", 234};
1180+
}
1181+
1182+
int get_number(const string& s) {
1183+
return phone_book[s];
1184+
}
1185+
```
1186+
1187+
**map 下标操作本质是搜索,如果没有找到 key 就会进行插入。**
1188+
1189+
*误会你了,map。我一直以为这个 map 是用散列表实现的。*
1190+
1191+
如果希望避免添加无效号码到电话簿中,应该使用 find() 和 insert() 代替 `[]`.
1192+
1193+
### unordered_map
1194+
*还有高手,原来这才是散列表.*
1195+
1196+
搜索 map 的时间复杂度是 O(log(n)). n 是 map 中的元素数目。虽然通常情况这个性能已经很好了,但是还可以更好——那就是用哈希查找。
1197+
1198+
标准库哈希容器是无序容器,不需要顺序比较函数。
1199+
1200+
标准库有默认的哈希函数,在必要的时候,用户也可以定义自己的哈希函数。
1201+
1202+
在给定了优秀的哈希函数的情况下,unordered_map 比 map 快得多,尤其是对大型容器而言。
1203+
11521204
#todo

0 commit comments

Comments
 (0)