如需转载,请注明出处。
经常编一些程序,感觉STL很有用,所以本次着手翻译一些文章,写个STL教程,以后用的话好直接查询。
一、容器
容器可以描述为包含相同类型数据的对象。容器用于实现不同的数据结构,例如数组,列表,树等。
以下是提供所有容器的详细信息以及头文件和与之关联的迭代器类型的容器:
容器 | 描述 | 头文件 | 迭代器 |
vector | vector是一个创建动态数组的类,允许在后面插入和删除。 | <vector> | 随机访问 |
list | list是允许从任何地方插入和删除的序列容器。 | <list> | 双向 |
deque | deque是双端队列,允许从两端插入和删除。 | <deque> | 随机访问 |
set | set是用于存储唯一集的关联容器。 | <set> | 双向 |
multiset | Multiset是用于存储非唯一集的关联容器。 | <set> | 双向 |
map | Map是用于存储唯一键值对的关联容器,即每个键仅与一个值(一对一映射)相关联。 | <map> | 双向 |
multimap | multimap是用于存储键值对的关联容器,每个键可以与多个值相关联。 | <map> | 双向 |
stack | 它遵循后进先出 | <stack> | 没有迭代器 |
queue | 它遵循先进先出 | <queue> | 没有迭代器 |
Priority-queue | 第一个元素总是最高优先级的元素。 | <queue> | 没有迭代器 |
容器的分类:
- 序列容器
- 关联容器
- 派生容器
注意:每个容器类都包含一组可用于操作内容的函数。
二.迭代器
- 迭代器是类似指针的实体,用于访问容器中的各个元素。
- 迭代器从一个元素顺序移动到另一个元素。此过程称为迭代容器。
迭代器主要包含两个函数:
begin():成员函数begin()返回向量的第一个元素的迭代器。
end():成员函数end()返回一个迭代器到容器的最后一个元素。
三.迭代器的类别
迭代器主要分为五类:
1.输入迭代器:
- 输入迭代器是一个迭代器,允许程序从容器中读取值。
- 取消引用输入迭代器允许我们从容器中读取值,但它不会改变值。
- 输入迭代器是单向迭代器。
- 输入迭代器可以递增,但不能递减。
2.输出迭代器:
- 输出迭代器类似于输入迭代器,除了它允许程序修改容器的值,但它不允许读取它。
- 它是一个单向迭代器。
- 它是一个只写迭代器。
3.前向迭代器:
- 前项迭代器使用++运算符在容器中导航。
- 前向迭代器一次遍历容器的每个元素和一个元素。
4.双向迭代器:
- 双向迭代器类似于前向迭代器,此外它也向后移动。
- 它是一个双向迭代器。
- 它可以递增也可以递减。
5.随机访问迭代器:
- 随机访问迭代器可用于访问容器的随机元素。
- 随机访问迭代器具有双向迭代器的所有功能,并且还具有一个附加功能,即指针添加。通过使用指针添加操作,我们可以访问容器的随机元素。
迭代器支持的操作:
迭代器 | 元素访问 | 读 | 写 | 增量操作 | 比较 |
输入 | -> | v=*p | ++ | ==,!= | |
输出 | *p=v | ++ | |||
前向 | -> | v=*p | *p=v | ++ | ==,!= |
双向 | -> | v=*p | *p=v | ++,-- | ==,!= |
随机访问 | ->、[] | v=*p | *p=v | ++,--,+,-,+=,--= | ==,!=,<,>,<=,>= |
四.算法
算法是在各种容器中用于处理其内容的函数。
要记住的要点:
- 算法提供大约60个算法函数来执行复杂操作。
- 标准算法允许我们同时使用两种不同类型的容器。
- 算法不是容器的成员函数,但它们是独立的模板函数。
- 算法可以节省大量的时间和精力。
- 如果我们想要访问STL算法,我们必须在程序中包含<algorithm>头文件。
STL算法可分为:
- 非突变算法:非突变算法是不改变容器对象的任何值的算法,也不改变它们出现的元素的顺序。这些算法可用于所有容器对象,并且它们使用前向迭代器。
- 变异算法:变异算法是可用于改变容器值的算法。它们还可用于更改它们出现的元素的顺序。
- 排序算法:排序算法是用于对容器中的元素进行排序的修改算法。
- 集合算法:集合算法也称为排序范围算法。该算法用于在容器上执行某些功能,极大地提高了程序的效率。
- 关系算法:关系算法是用于处理数值数据的算法。它们主要用于对容器中的所有元素执行数学运算。
五.函数对象
函数对象是一个包含在类中的函数,因此它看起来像一个对象。函数对象通过使用面向对象的特征(例如泛型编程)来扩展常规函数的特征。因此,我们可以说函数对象是一个智能指针,它比普通函数有许多优点。
以下是函数对象相对于常规函数的优点:
- 函数对象可以具有成员函数以及成员属性。
- 函数对象可以在使用之前初始化。
- 只有当签名不同时,常规函数才能有不同的类型。即使签名相同,函数对象也可以具有不同的类型。
- 函数对象比常规函数更快。
函数对象也称为“仿函数”。函数对象是一个包含至少一个operator()函数定义的对象。这意味着如果我们声明一个类的对象'd',其中定义了operator()函数,我们可以使用对象'd'作为常规函数。
假设'd'是类的对象,operator()函数可以被调用为:
d();
它是与下面相同:
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()函数的普通函数。