飞道的博客

C++标准库(STL)与泛型编程

433人阅读  评论(0)

六大部件

  • 分配器:支持容器
  • 容器:解决内存的存放与取的操作,是一个模板类
  • 算法:模板算法
    数据在容器里面,操作这些数据的算法是在另外的一组,不在容器的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格式。

容器分类

  1. 顺序式容器
  2. 关联式容器(key-value):用于查找。实现方式为红黑树。
  3. 不定序容器(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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场