标准库的基本概念

本文定义了标准C ++库的基本概念。 给出它是为了将来引用它。

C ++标准库的最大部分是STL(标准模板库)。 STL库包含五种主要类型的组件:

  • container :控制内存中的一组对象。
  • iterator :为该算法提供一种访问容器内容的算法。
  • algorithm :定义一个计算过程。
  • 函数对象 :将函数封装在对象中,以供其他组件使用。
  • adapter :调整组件以提供不同的接口。



所有组件均满足许多要求,因此彼此之间具有良好的一致性。

从容器的定义可以看出,任何用户数据结构都是容器。 在我们的例子中, 容器具有标准的数据结构 ,例如列表,向量,字典等。 容器的形式要求非常广泛,但是基本规则是访问元素。 通过特殊对象- 迭代器 (请参见下文)可以访问容器的元素。 您可能不知道容器的元素在内存中的位置,但是您可以肯定知道迭代器可以按顺序进行迭代,并且每个迭代器都可以访问该元素。 指向第一个元素的迭代器可以使用迭代器begin()方法获得; 容器。 指向最后一个元素迭代器可以使用迭代器end()方法获得; 容器。 换句话说,迭代器位于一个半间隔 (或段)中,可以正式写为[begin,end)。 容器声明示例:

struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); }; 

预期的C ++ 20标准建议使用封装半范围 - 范围的结构


迭代器是一个对象,它提供对容器元素的访问并允许对它们进行排序。 迭代器是容器的属性。 在C ++标准库的第一个实现中,迭代器被实现为指向容器元素的指针。 在现代实现中,这是一个封装指向容器对象的指针的类。

迭代器的主要要求是存在解引用和增量运算符。 下面是带有迭代器的容器声明。

 template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); }; 

与标准算法相比,我对算法的定义没有更好的定义: 算法是一系列操作,通过有限的步骤即可达到预期的效果

对于STL,算法由模板函数实现,该模板函数将迭代器的半间隔作为输入参数。 这些算法的一般签名描述如下:

 template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, ...); 

在类声明中,您可以覆盖运算符()。 如果在一个类中重写此运算符,则此类的对象将接收函数的属性(它们可用作函数)。 这些对象称为功能或函子 。 当函数应该具有“内存”时,使用函子以及替换指向函数的指针非常方便。
从C ++ 11标准开始,有可能对函子(lambda函数)进行简短的表示。
对函子没有特殊要求。 除非有时可能需要从functor 函数继承(直到C ++ 11标准-unary_function或binary_function)。 函子实现的一个小例子:

 template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } }; 

STL还提供了许多类和函数(函数),这些类和函数将接口转换为正确的接口。 特别地,存在一种堆栈适配器,其基于容器来实现堆栈。 例如,我们可以考虑将二进制函数的适配器转换为一元函数(目前在C ++标准中不推荐使用此函数):

 template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> class bind1st { BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) {} TYPE operator()(const TYPE& p) const { return _bf(_first, p); } }; 

供独立阅读


  1. github上的C ++ 20草案
  2. C ++参考
  3. C ++应用程序开发
  4. Range-v3,标准建议

Source: https://habr.com/ru/post/zh-CN434986/


All Articles