C++ 标准模板库

在 C++ 中,标准模板库 (STL) 提供了一套编程工具,用于实现算法和数据结构,如向量、列表、队列等。

STL 使用已经经过严格测试的通用类和函数来实现这些数据结构和算法。

C++ STL 主要有 3 个组件

  • 容器(Containers)
  • 迭代器(Iterators)
  • 算法

除了这些之外,STL 还提供了许多其他功能,包括函数对象、智能指针和异常处理机制。


C++ STL 容器

STL 容器按照需要以特定方式存储和组织数据。

例如,**向量**以顺序存储相同类型的数据。而**映射**则以键值对的形式存储数据。

我们可以将 STL 容器分为 3 类

1. 序列容器(Sequence containers):

2. 关联容器(Associative containers):

  • 集合
  • Multiset
  • Map
  • Multimap

3. 无序关联容器(Unordered associative containers):

要了解更多关于容器的信息,请访问我们的 C++ STL 容器教程。

注意: STL array 与我们之前使用的普通数组不同。STL array 定义在 std::array 类中,该类除了数组数据结构外,还包含许多有用的函数和算法。这些功能在普通数组中是不存在的。


示例 1:C++ STL 容器:Vector

在 C++ 中,向量类似于可调整大小的数组;它们以序列形式存储相同类型的数据,并且可以在运行时根据需要更改大小。

我们需要导入 <vector> 头文件才能使用向量。

#include <iostream>
#include <vector>
using namespace std; int main() {
// create vector of int type vector<int> numbers {1, 2, 3, 4, 5};
// print vector elements using ranged loop for (int number : numbers) { cout << number << " "; } return 0; }

输出

1  2  3  4  5

在这里,我们创建了一个名为 numbersint 类型向量,其中包含 5 个元素。

然后,我们使用 基于范围的 for 循环 打印了向量的所有元素。

要了解更多关于 C++ 向量的信息,请访问我们的 C++ 向量教程。


C++ STL 迭代器

迭代器是用于访问容器元素的对象的。

我们可以为 C++ 标准模板库中的每个容器声明一个迭代器。例如,

vector<int>::iterator it;

我们经常使用迭代器成员函数,如 begin()end() 等,来返回指向容器元素的迭代器。例如,

vector<int> numbers = {3, 2, 5, 1, 4};
vector<int>::iterator itr1 = numbers.begin();
vector<int>::iterator itr2 = numbers.end();

这里,

  • numbers.begin() - 返回一个指向 numbers 向量开头的迭代器,即元素 **3**
  • numbers.end() - 返回一个指向 numbers 向量末尾的迭代器。

注意: numbers.end() 返回的不是指向最后一个元素 **4** 的迭代器。相反,它返回一个指向最后一个元素之后的理论元素的迭代器。其他所有容器类型也是如此。

要了解更多关于 STL 迭代器的信息,请访问我们的 _C++ STL 迭代器_ 教程。


示例 2:C++ STL 迭代器

#include <iostream>
#include <vector>
using namespace std;

int main() {
    
    // initialize vector of int type
    vector<int> numbers {1, 2, 3, 4, 5};

// initialize vector iterator to point to the first element vector<int>::iterator itr = numbers.begin(); cout << "First Element: " << *itr << " "<<endl; // change iterator to point to the last element itr = numbers.end() - 1; cout << "Last Element: " << *itr;
return 0; }

输出

First Element: 1  
Last Element: 5

在这里,我们使用了 numbers.end()- 1 而不是 numbers.end()

这是因为 end() 函数指向容器最后一个元素之后的理论元素

因此,我们需要从 numbers.end() 中减去 **1** 才能指向最后一个元素。同样,使用代码 numbers.end()- 2 可以指向倒数第二个元素,依此类推。

注意: itr 前面的星号 * 表示正在访问迭代器所指向的元素的值。这类似于解引用指针

此外,当我们尝试打印迭代器时,会收到一个错误。

// error
cout << itr << "  ";

这是因为,与指针不同,我们无法打印迭代器。


C++ STL 算法

算法是一系列用于解决特定问题的指令。

在 C++ 中,我们可以使用标准模板库来实现一些常用的算法。这些 STL 组件通常被称为“算法库”。

C++ 标准模板库中最常用的算法包括

  • 排序算法
  • 搜索算法
  • 复制算法
  • 计数算法

要了解更多关于算法库的信息,请访问我们的 _C++ STL 算法_ 教程。


示例 3:C++ STL 排序算法

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    
    // initialize vector of int type
    vector<int> numbers = {3, 2, 5, 1, 4};

// sort vector elements in ascending order sort(numbers.begin(), numbers.end());
// print the sorted vector for (int number : numbers) { cout << number << " "; } return 0; }

输出

1  2  3  4  5

在此示例中,我们使用了 sort() 函数将 numbers 向量的元素按升序排序。

请注意,我们导入了 <algorithm> 头文件来使用 sort() 函数。


你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战