STL容器概述
到目前为止,STL库最常用的功能是STL容器类。如果您需要快速了解容器类,请查看课程 容器类。
STL包含许多不同的容器类,可以在不同的情况下使用。一般来说,容器类分为三个基本类别:序列容器,关联容器和容器适配器。我们将在这里快速概述容器。
序列容器
序列容器是容器类,用于维护容器中元素的顺序。序列容器的一个定义特征是您可以选择按位置插入元素的位置。序列容器最常见的示例是数组,如果将四个元素插入到数组中,则元素将按照插入它们的确切顺序排列。
从C ++ 11开始,STL包含6个序列容器:std :: vector,std :: deque,std :: array,std :: list,std :: forward_list和std :: basic_string。
如果你曾经学过物理学,你可能会想到一个向量作为一个具有大小和方向的实体。不幸的是,STL中的命名向量类是一个动态数组,能够根据需要增长以包含其元素。向量类允许通过operator []随机访问其元素,并且从向量末尾插入和删除元素通常很快。
以下程序在向量中插入6个数字,并使用重载的[]运算符访问它们以便打印它们。
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector<int> vect;
for (int nCount=0; nCount < 6; nCount++)
vect.push_back(10 - nCount); //插入数组的末尾
for (int nIndex=0; nIndex < vect.size(); nIndex++)
cout << vect[nIndex] << " ";
cout << endl;
}
该程序产生结果:
10 9 8 7 6 5
该双端队列类是一个双端队列类,作为一个动态阵列,可以从两端增长实现。
#include <iostream>
#include <deque>
int main()
{
using namespace std;
deque<int> deq;
for (int nCount=0; nCount < 3; nCount++)
{
deq.push_back(nCount); // 插入数组的末尾
deq.push_front(10 - nCount); // 插入数组前面
}
for (int nIndex=0; nIndex < deq.size(); nIndex++)
cout << deq[nIndex] << " ";
cout << endl;
}
该程序产生结果:
8 9 10 0 1 2
列表是一种特殊类型的称为双重链接列表,其中在容器中的每个元素包含指向在该列表中的下一个和前元素指针序列的容器。列表仅提供对列表开头和结尾的访问,不提供随机访问。如果要在中间找到一个值,则必须从一端开始并“遍历列表”,直到找到要查找的元素。列表的优点是,如果您已经知道要插入它们的位置,则将元素插入列表的速度非常快。通常,迭代器用于遍历列表。
我们将在以后的课程中详细讨论链表和迭代器。
尽管STL 字符串(和wstring)类通常不作为一种序列容器包含,但它们本质上是,因为它们可以被认为是具有char(或wchar)类型的数据元素的向量。
关联容器
关联容器是在将这些输入插入容器时自动对其输入进行排序的容器。默认情况下,关联容器使用operator <来比较元素。
一组是存储独特的元素,不允许重复元素的容器。元素根据其值进行排序。
多重集是一组,其中重复的元素是允许的。
map(也称为关联数组)是一组,其中每个元素是一对,称为密钥/值。密钥用于对数据进行排序和索引,并且必须是唯一的。该值是实际数据。
一个多重映射(也称为字典)是一个地图,允许重复。现实生活中的词典是多重映射:关键是word,值是word的含义。所有key都按升序排序,您可以按key查找值。有些word可以有多种含义,这就是字典是多图而不是地图的原因。
容器适配器
容器适配器是特殊的预定义容器,适用于特定用途。有关容器适配器的有趣部分是您可以选择希望它们使用的序列容器。
堆栈是从容器的端部,其中元件在一个LIFO(后进先出)的上下文,其中,元件插入(推)和移除(弹出)操作的容器。堆栈默认使用deque作为它们的默认序列容器(这似乎很奇怪,因为矢量看起来更自然),但也可以使用矢量或列表。
队列是其中元件以FIFO(先入先出)的上下文,其中,元件插入从前方(推动)到容器的背面与去除(弹出)操作的容器。队列默认使用deque,但也可以使用list。
优先级队列是一种类型的队列的其中元素保持排序(通过operator<)。按下元素时,元素将在队列中排序。从前面删除元素将返回优先级队列中的最高优先级项。