1. unordered_set无论是利用上述方法,还是for循环逐个初始化的方式都可以删除重复的元素。
  2. unordered_set.find()找不到元素会返回.end()迭代器
  3. unordered_map 模板类中,insert() 方法可以将 pair< , > 类型的键值对元素添加到 unordered_map 容器中。pair< , >类型用{ }表示,与vector一样是大括号。
  4. unordered_map中不可以重复元素的个数,但可以利用value++来统计重复元素的数量。
  5. deque实现,512个连续空间构成一个buffer,离散的buffer的指针连续放置构成整个deque
  6. for(auto ks:vec);for(auto &ks:vec);
  7. 为什么vector(GP)自己不定义sort,而是用标准库中的::sort()?list(OOP)为什么用自己类中的void sort();
  8. 向unorderd_set< int > set1中加入1000000个随机数,set1.size()为MAX_INT。
  9. unordered_multiset中篮子数必大于其中的元素数,且其中许多篮子为空,许多哈希碰撞的元素构成篮子中的链。
  10. template类模板,函数模板,模板的特化、偏特化(P10)
1
2
3
4
5
6
7
8
9
10
11

//泛化
template <class T>
struct __type_traits{

}
//特化
template<> struct __type_traits<int>{

}

  1. STL链表List,实际上实现是环状链表,这时list.end()就是用一个空节点表示。迭代器的重构P14
  2. iteraror的traits,萃取机,是个中间层,过滤指针与迭代器,因为只有迭代器能调用STL内部的算法P15
  3. allocator分配器,实现两个函数,底层分别基于malloc与free。在2.9版本的优化为链表每个节点对应开一大块空间,以节省每次malloc产生的cookie。P11
  4. cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错。通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。
  5. 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

  6. deque自身是如何扩容的,扩容后把自己放在原来的中段,deque是如何利用buffer伪装成连续的,deque的迭代器怎样构成的,deque怎样设定buffer的大小
  7. stack与queue默认以deque为底层,但它们俩由于特殊的进出形式,本身是没有设定迭代器的。stack与queue也可以用链表list作为底层,但以vector,map,set为底层则在部分功能上会出现问题。
1
2
3
4
5

queue<string,list<string>> c1;

queue<string,vector<string>> c2;

调用queue各种接口,c1能全部编译通过,c2部分功能不能

  1. unordered_map、unordered_set、unordered_multimap、unordered_multiset它们的底层是红黑树,unordered_map和unordered_set的插入元素调用的是红黑树的insert_unique(),unordered_multimap和unordered_multiset调用的是insert_equal()。红黑树.begin()返回的迭代器是指向最左下节点的迭代器,红黑树.end()返回的是指向最右下节点的迭代器。
  2. 只有map可以用map[ key ]=value来创建元素,这是map所独有的,multimap用multimap.insert(pair< , >())
  3. hashtable 底层是vector挂链表,即vector< node*>(如果这个链表很长,就是循序搜索),当插入元素个数大于bucket个数时,进行rehashing篮子数按质数扩大将近一倍,每个元素重新计算hash值并重新插入到hashtable中。
  4. 所有的迭代器分为五类:input_iterator_tag;farward_iterator_tag;bidirectional_iterator_tag;random_access_iterator_tag;
    output_iterator_tag;
  5. 几乎所有的算法函数格式都一样,在算法函数中传入一个头迭代器,尾迭代器,判断条件。