STL源码解析
- unordered_set无论是利用上述方法,还是for循环逐个初始化的方式都可以删除重复的元素。
- unordered_set.find()找不到元素会返回.end()迭代器
- unordered_map 模板类中,insert() 方法可以将 pair< , > 类型的键值对元素添加到 unordered_map 容器中。pair< , >类型用{ }表示,与vector一样是大括号。
- unordered_map中不可以重复元素的个数,但可以利用value++来统计重复元素的数量。
- deque实现,512个连续空间构成一个buffer,离散的buffer的指针连续放置构成整个deque
- for(auto ks:vec);for(auto &ks:vec);
- 为什么vector(GP)自己不定义sort,而是用标准库中的::sort()?list(OOP)为什么用自己类中的void sort();
- 向unorderd_set< int > set1中加入1000000个随机数,set1.size()为MAX_INT。
- unordered_multiset中篮子数必大于其中的元素数,且其中许多篮子为空,许多哈希碰撞的元素构成篮子中的链。
- template类模板,函数模板,模板的特化、偏特化(P10)
1 |
|
- STL链表List,实际上实现是环状链表,这时list.end()就是用一个空节点表示。迭代器的重构P14
- iteraror的traits,萃取机,是个中间层,过滤指针与迭代器,因为只有迭代器能调用STL内部的算法P15
- allocator分配器,实现两个函数,底层分别基于malloc与free。在2.9版本的优化为链表每个节点对应开一大块空间,以节省每次malloc产生的cookie。P11
- cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错。通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。
- GNU2.9 iterator_trait的偏特化使得可以接受vector< int >::iterator的int*指针。后续版本中vector的迭代器更改为大类迭代器,因此cout<< vector< int >::iterator输出不了。
1
2
3
4
5
6
7
typedef T;
typedef value_type* iterator;
//GNU2.9
typedef __gnu_cxx::__normal_iterator<pointer,vector> iterator;//GNU4.9 - deque自身是如何扩容的,扩容后把自己放在原来的中段,deque是如何利用buffer伪装成连续的,deque的迭代器怎样构成的,deque怎样设定buffer的大小
- stack与queue默认以deque为底层,但它们俩由于特殊的进出形式,本身是没有设定迭代器的。stack与queue也可以用链表list作为底层,但以vector,map,set为底层则在部分功能上会出现问题。
1 |
|
调用queue各种接口,c1能全部编译通过,c2部分功能不能
- unordered_map、unordered_set、unordered_multimap、unordered_multiset它们的底层是红黑树,unordered_map和unordered_set的插入元素调用的是红黑树的insert_unique(),unordered_multimap和unordered_multiset调用的是insert_equal()。红黑树.begin()返回的迭代器是指向最左下节点的迭代器,红黑树.end()返回的是指向最右下节点的迭代器。
- 只有map可以用map[ key ]=value来创建元素,这是map所独有的,multimap用multimap.insert(pair< , >())
- hashtable 底层是vector挂链表,即vector< node*>(如果这个链表很长,就是循序搜索),当插入元素个数大于bucket个数时,进行rehashing篮子数按质数扩大将近一倍,每个元素重新计算hash值并重新插入到hashtable中。
- 所有的迭代器分为五类:input_iterator_tag;farward_iterator_tag;bidirectional_iterator_tag;random_access_iterator_tag;
output_iterator_tag; - 几乎所有的算法函数格式都一样,在算法函数中传入一个头迭代器,尾迭代器,判断条件。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment