侯捷C++STL源码分析

发布时间 2023-06-07 10:37:39作者: 不会笑的孩子

STL六大部件

  • 容器(Containers):放东西,需要占用内存。

  • 分配器(Allocators):支持容器。

  • 算法(Algorithms):操作容器里面的数据。

  • 迭代器(Iterators):容器和算法之间的桥梁,泛化的指针。

  • 适配器(A dapters)

  • 仿函数(Functors)

#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;
int main()
{
 int ia[6] = {27,210,12,47,109,83};
 vector<int,allocator<int>> vi(ia,ia+6)//vector<类型,分配器(/*一般不会写*/)>
 cout<<cout_if(vi.begin(),vi.end(),not1(bind2nd(less<int>(),40)));//其中cout_if为algorithm,not1为functionadapter(negator) bind2nd为functionadapter(binder) less<int>为functionobject
 return 0;
}

复杂度 Complexity,Big-oh

O(1)或O(c):常数时间(constant time)

O(n):称为线性时间(linear time)

O(log2 n)称为二次线性时间(sub—linlear time)

O(n*n)称为平方时间(quadratic time)

O(nnn)称为立方时间(cubic time)

O(2的n次方)称为指数时间

O(nlog2 n):

前闭后开区间

range-based for statement (since C++11)

for(decl:coll){
  statement  
}
for(int i :{2,3,57,9,13,17,19}){
    std::cout<<i<<std::endl;
}
std::vector<double> vec;
...
for(auto elem:vec){
   std::cout<<elem<<std::endl;
}
for(auto& elem:vec){
  elem *= 3;
}

auto key

list<string> c;
list<string>::iterator ite;
ite = ::find(c.begin,c.end(),target);

list<string> c;
....
auto ite = ::find(c.begin,c.end(),target);

容器——结构及分类

Sequence Contaioners(序列式容器)

Array:数组(c++11增加的,连续空间)

Vector:动态数组(分配器去处理)

Deque:双向队列(先进先出)

List:双向链表

Forward-List:单向链表

Associative Containers(关联式容器)适合快速查找

Set/Multiset(红黑树是高度平衡二叉树,Set放的元素不能重复,Multiset放的元素可以重复)

Map/Multimap(key:value)

Unordered Containers(HashTable)