标准模板库(STL)入门指南
立即解锁
发布时间: 2025-08-19 01:36:37 阅读量: 1 订阅数: 6 


C++面向对象编程入门与实践
### 标准模板库(STL)入门指南
#### 1. 基于适配器的容器
在C++编程中,基于适配器的容器是一种非常实用的工具。以下是几种常见的基于适配器的容器及其特点:
| 容器 | 实现方式 | 特点 |
| --- | --- | --- |
| stack | 可实现为vector、list或deque | 仅在一端进行插入(push)和移除(pop)操作 |
| queue | 可实现为list或deque | 在一端插入(push),在另一端移除(pop) |
| priority queue | 可实现为vector或deque | 在一端以随机顺序插入(push),在另一端以排序顺序移除(pop) |
要实例化这些类,需要使用模板中的模板。例如,创建一个存储int类型的stack对象,从deque类实例化:
```cpp
stack< deque<int> > aStak;
```
需要注意的是,两个右尖括号之间必须有一个空格,否则编译器会将`>>`解释为运算符,导致语法错误。
#### 2. 算法
STL算法是对容器中的元素执行操作的函数。这些算法是独立的模板函数,而非容器类的成员函数或友元函数。你可以将它们应用于内置的C++数组或自己创建的容器类(前提是该类包含某些基本函数)。以下是一些典型的STL算法及其用途:
| 算法 | 用途 |
| --- | --- |
| find | 返回与指定值相等的第一个元素 |
| count | 计算具有指定值的元素数量 |
| equal | 比较两个容器的内容,如果所有对应元素都相等则返回true |
| search | 在一个容器中查找与另一个容器中相同的序列 |
| copy | 将一个容器中的值序列复制到另一个容器(或同一容器的不同位置) |
| swap | 交换两个位置的值 |
| iter_swap | 交换两个位置的值序列 |
| fill | 将一个值复制到一系列位置 |
| sort | 根据指定的顺序对容器中的值进行排序 |
| merge | 合并两个已排序的元素范围,形成一个更大的已排序范围 |
| accumulate | 返回给定范围内元素的总和 |
| for_each | 对容器中的每个元素执行指定的函数 |
以下是一个使用`sort()`算法对数组进行排序的示例:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
int arr[8] = {42, 31, 7, 80, 2, 26, 19, 75};
int main()
{
sort(arr, arr+8);
for(int i = 0; i < 8; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
该示例中,`sort()`函数的第一个参数是要排序的数组的起始地址,第二个参数是数组最后一个元素的下一个地址。
#### 3. 迭代器
迭代器是一种类似指针的实体,用于访问容器中的单个数据项(通常称为元素)。它们常用于顺序遍历容器中的元素。在STL中,迭代器由迭代器类的对象表示。迭代器主要分为以下几类:
| 迭代器类型 | 读写能力 | 能否保存 | 移动方向 | 访问方式 |
| --- | --- | --- | --- | --- |
| 随机访问迭代器 | 读写 | 是 | 前后移动 | 随机 |
| 双向迭代器 | 读写 | 是 | 前后移动 | 线性 |
| 前向迭代器 | 读写 | 是 | 仅向前 | 线性 |
| 输出迭代器 | 仅写 | 否 | 仅向前 | 线性 |
| 输入迭代器 | 仅读 | 否 | 仅向前 | 线性 |
#### 4. STL可能存在的问题
尽管STL功能强大,但也存在一些潜在问题:
- **错误查找困难**:编译器有时会将错误报告为位于头文件深处,而实际错误可能在用户代码中。此时,可能需要采用逐行注释代码的方法来找出问题所在。
- **预编译头文件问题**:预编译头文件可以显著加快编译速度,但可能会导致STL出现问题。如果程序运行不正常,可以尝试关闭预编译头文件。
- **虚假编译器警告**:STL可能会生成一些看似无害的编译器警告,如“转换可能会丢失有效数字”,可以忽略或关闭这些警告。
#### 5. 部分算法的具体应用
##### 5.1 find()算法
`find()`算法用于查找容器中第一个具有指定值的元素。以下是一个示例:
```cpp
// find.cpp
// finds the first object with a specified value
#include <iostream>
#include <algorithm> //for find()
using namespace std;
int arr[] = { 11, 22, 33, 44, 55, 66, 77, 88 };
int main()
{
int* ptr;
ptr = find(arr, arr+8, 33); //find first 33
cout << "First object with value 33 found at offset "
<< (ptr-arr) << endl;
return 0;
}
```
该程序的输出为:
```
First object with value 33 found at offset 2.
```
`find()`函数的前两个参数指定了要检查的元素范围,这两个值由迭代器指定。在这个例子中,使用的是普通的C++指针,它是迭代器的一种特殊情况。
##### 5.2 count()算法
`count()`算法用于计算容器中具有指定值的元素数量。示例如下:
```cpp
// count.cpp
// counts the number of objects with a specified value
#include <iostream>
#include <algorithm> //for count()
using namespace std;
int arr[] = { 33, 22, 33, 44, 33, 55, 66, 77 };
int main()
{
int n = count(arr, arr+8, 33); //count number of 33’s
cout << "There are " << n << " 33’s in arr." << endl;
return 0;
}
```
程序输出:
```
There are 3 33’s in arr.
```
##### 5.3 sort()算法
`sort()`算法用于对容器中的元素进行排序。以下是一个对整数数组进行排序的示例:
```cpp
// sort.cpp
// sorts an array of integers
#include <iostream>
#include <algorithm>
using namespace std;
//array of numbers
int arr[] = {45, 2, 22, -17, 0, -30, 25, 55};
int main()
{
sort(arr, arr+8); //sort the numbers
for(int j=0; j<8; j++) //display sorted array
cout << arr[j] << ' ';
cout << endl;
return 0;
}
```
输出结果:
```
-30 -17 0 2 22 25 45 55
```
##### 5.4 search()算法
`search()`算法用于在一个容器中查找与另一个容器中相同的序列。示例如下:
```cpp
// search.cpp
// searches one container for a sequence in another container
#include <iostream>
#include <algorithm>
using namespace std;
int source[] = { 11, 44, 33, 11, 22, 33, 11,
```
0
0
复制全文
相关推荐










