六大部件
- 分配器:支持容器
- 容器:解决内存的存放与取的操作,是一个模板类
- 算法:模板算法
数据在容器里面,操作这些数据的算法是在另外的一组,不在容器的class里,这就不是面向对象编程,而是泛型编程 - 迭代器:作为容器和算法之间的桥梁,是一种泛化的指针,
- 仿函数:作用像是一个函数,是一种抽象的函数,比如两个类之间的相加
- 适配器:可以做转换,比如用来绑定在某个算法中 。
复杂度
根据使用条件,选择适配容器。
前闭后开区间
begin指向第一个元素,end指向最后一个元素的下一个元素
Container<T>::iterator iter = c.begin();
for (;, iter != c.end(); ++iter)
注意以下两种用法
for (auto elem: vec)
{
cout << elem;
}
for (auto & elem: vec)
{
elem *= 3;
cout << elem;
}
前者将创建范围内每个元素的副本,其修改不会影响vec中的相应元素,由于每个循环都会创建一个副本,因此会带来系统开销。
后者增加了引用,也就是对于元素的操作,可以回返给elem元素本身,即改变内存中的值。
如果要确保未修改a中的数据并且要提高效率,可以使用const auto & elem : vec格式。
容器分类
- 顺序式容器
- 关联式容器(key-value):用于查找。实现方式为红黑树。
- 不定序容器(Unordered Container)其实本质上属于关联式容器的一种。实现方式为hashtable(Separate Chaining散列表)
使用分配器allocator
迭代器的设计原则和iterator Traits(特征)
自定义的类,例如list、map等(自己往里面填充各种类型的数据),在类定义里就有iterator,那么调用的时候直接类名::iterator就可以调用了,但如果是内置类型,比如int、float没有iterator。具体实现机制有一个萃取机Iterator Traits。
Iterator Traits用以分离class iterators和non-class iterators。
根据使用条件的不同,来选择不同的结构体实现,模板在萃取机制中的应用。模板让编译器能够根据具体的类型编译出具体的函数,从而确定到底是用指针类型还是迭代器的类型,进而适配成统一的接口,有点类似多态的概念。
STL周边技术
一个万用的Hash Function
转载:https://blog.csdn.net/qq_37499774/article/details/117223875
查看评论