个性化阅读
专注于IT技术分析

STL组件的用法

本文概述

容器

容器可以描述为保存相同类型数据的对象。容器用于实现不同的数据结构, 例如数组, 列表, 树等。

以下是提供所有容器以及头文件和与之关联的迭代器类型的详细信息的容器:

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

容器分类:

  • 序列容器
  • 关联容器
  • 衍生容器
STL组件

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

迭代器

  • 迭代器是类似指针的实体, 用于访问容器中的各个元素。
  • 迭代器从一个元素顺序移动到另一个元素。此过程称为遍历容器。
STL组件
  • 迭代器主要包含两个功能:

begin():成员函数begin()将迭代器返回到向量的第一个元素。

end():成员函数end()将迭代器返回到容器的last-last-last元素。

STL组件

迭代器类别

迭代器主要分为五类:

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

迭代器支持的操作

迭代器 元素访问 增量运算 比较方式
input -> v = * p ++ ==, !=
output * p = v ++
forward -> v = * p * p = v ++ ==, !=
Bidirectional -> v = * p * p = v ++, — ==, !=
Random access ->, [ ] v = * p * p = v ++, –, +, -, +=, –= ==, !=, <, >, <=, >=

演算法

算法是在各种容器中用于处理其内容的函数。

要记住的要点:

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

STL算法可以归类为:

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

功能对象

Function对象是包装在类中的函数, 因此它看起来像一个对象。功能对象通过使用面向对象(例如通用编程)的功能来扩展常规功能的特性。因此, 可以说函数对象是一个智能指针, 它比普通函数具有很多优点。

以下是函数对象相对于常规函数的优点:

  • 函数对象可以具有成员函数以及成员属性。
  • 可以在使用功能对象之前对其进行初始化。
  • 仅当签名不同时, 常规函数才可以具有不同的类型。即使签名相同, 功能对象也可以具有不同的类型。
  • 函数对象比常规函数要快。

函数对象也称为“函数器”。函数对象是至少包含一个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()函数。

赞(0)
未经允许不得转载:srcmini » STL组件的用法

评论 抢沙发

评论前必须登录!