以前学习过标准库,最近身边有人问到相关话题,故在此作一个总结ios
C++标准库:C++ Standard Library
C++标准模板库:Standard Template Library(STL)c++
引用方法:算法
1 #include <iostream> 2 #include <cstdio> //snprintf() 3 #include <cstdlib> //RAND_MAX 4 #include <cstring> //strlen(), memcpy() 5 #include <string> 6 using namespace std; 7 using std::cin; 8 using std::cout; 9 using std::string;
以上的六大部件解释以下:数组
()
操做符,使用在自定义类对象时,好比咱们对石头进行排序,在算法操做时就能够写一些仿函数供算法正确使用,实现方式时类模板;
要讨论时间复杂度,其中n必须创建在足够大的工业数据基础上函数
STL采用前闭后开区间表示数据的范围,全部的数据都是经过begin()和end()两个函数表示数据的范围,begin表示数据的头,end表示数据尾的下一个元素,也就是说,对end进行解引用操做获得的指针它是不肯定的东西,也可能形成程序宕机或者其余不是你内心所想的东西。学习
容器分为序列式容器和关联式容器(分为有序和无序),红色部分是c++2.0引入的spa
序列式容器(Sequence Container):元素都是有序的,里面的空间多是连续的,也多是由指针一个个串起来的;指针
关联式容器(Associative Container):元素是由key和value组成的,固然用key能很快找value,适用于查找操做code
对比于c语言的数组,标准库进行封装,初始化的时候就要肯定大小,不能扩展(注意在栈上有大小限制,不一样的机器内存限制不同);对象
一种能够动态扩充的数组,只能在容器的末端进行扩充,当容量不足时会自动扩充,扩充规则为当前空间的2倍,内存由Vector背后的分配器进行,使用者不用关心内存分配问题;
双端队列,容器两端都可进行数据扩充;
双向环状链表,内存占用比Forward_List多;
单向链表,只能从尾部扩充。
元素key是有序
目前各大厂商编译器都是由红黑树(RBtree)实现,保证每一个子树根节点键值大于左子树全部节点的键值,小于右子树全部节点的键值,左右是高度平衡的防止某一个分支比较长,每一个元素由key和value组成,set中key和value是同一个值,key和value是不分的,元素不可重复,当重复放入时容器会反弹回来;
MultSet表示元素能够重复。
目前各大厂商编译器也都是由红黑树实现,区别于set,每一个元素分为key和value,一样元素不可重复,当重复放入时容器会反弹回来;
Multimap表示元素可重复,也就是key-value可重复。
元素的key是无序的;
Unordered set和Unordered map底层是由哈希表(Hashtable)实现,用哈希表必然存在元素碰撞问题,因此各大编译器都采用Separate Chaining哈希表。