菜鸟笔记
提升您的技术认知

C++ STL的组件

阅读 : 1430

容器

容器可以描述为保存相同类型数据的对象。容器用于实现不同的数据结构,例如数组,列表,树等。 以下是提供所有容器的详细信息以及标头文件和与之关联的迭代器类型的容器。他们:

容器 说明 头文件 迭代器
vector vector是创建动态数组的类,该数组允许在后面插入和删除 <vector> 随机访问
list list是允许从任何位置插入和删除的序列容器。 <list> 双向
deque Deque 是 Deque ,允许从两端插入和删除。 <deque> 随机访问
set set是用于存储唯一集的关联容器。 <set> 双向
multiset Multiset是用于存储非唯一集的关联容器。 <set> 双向
map Map是用于存储唯一键值对的关联容器,即每个键仅与一个值(一对一映射)相关联。 <map> 双向
multimap multimap是用于存储键值对的关联容器,每个键可以与多个值相关联。 <map> 双向
stack 后进先出(LIFO)。 <stack> 没有迭代器
queue 先入先出(FIFO)。 <queue> 没有迭代器
Priority-queue 第一个元素始终是最高优先级的元素。 <queue> 没有迭代器

容器分类:
序列容器
关联容器
衍生容器

注意: 注意: 每个容器类都包含一组可用于操作内容的函数。

ITERATOR

迭代器是类似指针的实体,用于访问容器中的各个元素。
迭代器从一个元素顺序移动到另一个元素。此过程称为遍历容器。

迭代器主要包含两个功能: begin(): 成员函数begin()将迭代器返回到 Vector 的第一个元素。 end(): 成员函数end()将迭代器返回到容器的过去-last元素。

迭代器类别

迭代器主要分为五类:

输入迭代器: Input迭代器是允许程序从容器读取值的迭代器。 取消引用输入迭代器后,我们可以从容器中读取值,但不会更改该值。 输入迭代器是单向迭代器。 输入迭代器可以递增,但不能递减。
输出迭代器: 输出迭代器与输入迭代器类似,不同之处在于它允许程序修改容器的值,但不允许读取它。 这是一个单向迭代器。 这是一个只写迭代器。
转发迭代器: 转发迭代器使用++运算符浏览容器。 转发迭代器一次遍历容器的每个元素,一次遍历一个元素。
双向迭代器: 双向迭代器与正向迭代器相似,不同之处在于它也向后移动。 这是一种双向迭代器。 可以递增或递减。
随机访问迭代器: 随机访问迭代器可用于访问容器的随机元素。 随机访问迭代器具有双向迭代器的所有功能,并且还具有一个附加功能,即指针添加。通过使用指针添加操作,我们可以访问容器的随机元素。 迭代器支持的操作

迭代器 元素访问 阅读 增量操作 比较
输入 -> v = * p ++ ==,!=
输出 * p = v ++
转发 -> v = * p * p = v ++ ==,!=
双向 -> v = * p * p = v ++,- ==,!=
随机访问 ->,[] v = * p * p = v ++,-,+,-,+ =,-= ==,!=,<,>,<=,> =

算法

算法是在各种容器中用于处理其内容的函数。 要记住的要点:
算法提供约60种算法功能来执行复杂的操作。
标准算法使我们可以同时处理两种不同类型的容器。
算法不是容器的成员函数,而是独立的模板函数。
算法节省了大量时间和精力。
如果要访问STL算法,必须在程序中包含头文件。 STL算法可以归类为:

非变异算法: 非变异算法是既不更改容器对象的任何值,也不改变其出现的元素顺序的算法。这些算法可用于所有容器对象,并利用前向迭代器。
突变算法: 突变算法是可用于更改容器值的算法。它们也可以用来更改它们出现的元素的顺序。
排序算法: 排序算法是用于对容器中的元素进行排序的修改算法。
设置算法: 设置算法也称为排序范围算法。该算法用于在容器上执行某些功能,从而大大提高了程序的效率。
关系算法: 关系算法是用于处理数字数据的算法。它们主要用于对容器中的所有元素执行 Math 运算。

功能对象

函数对象是包装在类中的函数,因此看起来像对象。功能对象通过使用面向对象(例如通用编程)的功能扩展了常规功能的特性。因此,可以说函数对象是一个智能指针,它比普通函数具有很多优点。 以下是函数对象与常规函数相比的优点:
函数对象可以具有成员函数以及成员属性。
可以在使用功能对象之前对其进行初始化。
仅当签名不同时,常规函数才可以具有不同的类型。函数对象可以具有不同的类型,即使信号自然是一样的。
函数对象比常规函数要快。 功能对象也称为" 功能键"。函数对象是包含 operator()函数的至少一个定义的对象。这意味着,如果声明定义了 operator()函数的类的对象'd',则可以将对象'd'用作常规函数。 假设" d"是类的对象,operator()函数可以称为:

d();
which is same as:
d.operator() ( );

让我们看一个简单的示例:

#include <iostream>
      using namespace std;
     class function_object
     {
         public:
        int operator()(int a, int b)            
       {
           return a+b;
       }
    };
     int main()
    {
       function_object f;               
       int result = f(5,5);
      cout<<"Addition of a and b is : "<<result;
    return 0;
}

输出:

Addition of a and b is : 10

在上面的示例中," f"是function_object类的一个对象,其中包含operator()函数的定义。因此,'f'可以用作调用operator()函数的普通函数。