C++标准模板库(STL)是C++标准库的一部分,它提供了一系列的模板类和模板函数,用于实现常用的数据结构和算法。STL的优点是它可以让你使用各种数据结构和算法,而不需要自己编写或安装额外的代码,也不需要关心底层的实现细节。STL还可以让你编写通用、高效、可重用的代码,提高程序的性能和质量。
模板是一种参数化的代码,它可以根据不同的类型或值来生成不同的代码。模板可以让你编写一次代码,就可以应用到多种类型或值上,而不需要重复编写相似的代码。C++中有两种模板:类模板和函数模板。类模板用于定义泛型的类,函数模板用于定义泛型的函数。例如:
```c++
// 定义一个类模板,表示一个二元组
template <typename T1, typename T2>
class PAIr {
private: // 私有数据成员,只能在类内部访问
T1 first; // 第一个元素
T2 second; // 第二个元素
public: // 公有成员函数,可以在类外部访问
Pair(T1 f, T2 s) {
// 构造函数,用于初始化对象
first = f; // 给第一个元素赋值
second = s; // 给第二个元素赋值
}
T1 get_first() {
// 成员函数,用于获取第一个元素
return first;
}
T2 get_second() {
// 成员函数,用于获取第二个元素
return second;
}
};
// 定义一个函数模板,表示两个数的最大值
template <typename T>
T max(T a, T b) {
// 函数体,用于返回两个数中较大的那个
return a > b ? a : b;
}
// 使用类模板和函数模板
Pair<int, string> p(1, "one"); // 创建一个Pair对象,类型参数为int和string
cout << p.get_first() << endl; // 输出1
cout << p.get_second() << endl; // 输出one
cout << max(10, 20) << endl; // 输出20,类型参数为int
cout << max(3.14, 2.71) << endl; // 输出3.14,类型参数为double
```
容器是一种存储数据的数据结构,它提供了各种操作数据的接口。STL提供了多种容器,根据存储方式和特性可以分为两大类:序列容器和关联容器。序列容器按照顺序存储数据,如`vector`、`list`、`deque`等;关联容器按照某种规则存储数据,如`set`、`map`、`unordered_set`、`unordered_map`等。例如:
```c++
#include <vector> // 引入vector头文件
#include <set> // 引入set头文件
using namespace std;
// 使用序列容器vector
vector<int> v; // 创建一个空的vector对象
v.push_back(10); // 在尾部插入10
v.push_back(20); // 在尾部插入20
v.push_back(30); // 在尾部插入30
for (int i = 0; i < v.size(); i++) {
// 遍历vector中的元素
cout << v[i] << " "; // 输出10 20 30
}
cout << endl;
// 使用关联容器set
set<int> s; // 创建一个空的set对象
s.insert(10); // 插入10
s.insert(20); // 插入20
s.insert(30); // 插入30
s.insert(10); // 插入10,由于set中不能有重复元素,所以这个操作无效
for (auto it = s.begin(); it != s.end(); it++) {
// 遍历set中的元素,使用迭代器
cout << *it << " "; // 输出10 20 30,注意set中的元素是按照升序排列的
}
cout << endl;
```
算法是一种对数据进行操作或处理的函数,它提供了各种常用的功能。STL提供了多种算法,根据功能可以分为几类:排序算法、查找算法、修改算法、计数算法、生成算法等。例如:
```c++
#include <algorithm> // 引入algorithm头文件
#include <vector> // 引入vector头文件
using namespace std;
// 使用排序算法sort
vector<int> v = {5, 3, 7, 1, 9}; // 创建一个vector对象,并初始化为5个元素
sort(v.begin(), v.end()); // 对vector中的元素进行升序排序,使用迭代器指定范围
for (int i = 0; i < v.size(); i++) {
// 遍历vector中的元素
cout << v[i] << " "; // 输出1 3 5 7 9
}
cout << endl;
// 使用查找算法find
auto it = find(v.begin(), v.end(), 7); // 在vector中查找7,返回一个迭代器
if (it != v.end()) {
// 如果找到了
cout << "Found 7 at position " << it - v.begin() << endl; // 输出Found 7 at position 3
} else {
// 如果没找到
cout << "Not found 7" << endl;
}
// 使用修改算法reverse
reverse(v.begin(), v.end()); // 对vector中的元素进行反转,使用迭代器指定范围
for (int i = 0; i < v.size(); i++) {
// 遍历vector中的元素
cout << v[i] << " "; // 输出9 7 5 3 1
}
cout << endl;
// 使用计数算法count
int c = count(v.begin(), v.end(), 5); // 在vector中计算5出现的次数,返回一个整数
cout << "5 Appears " << c << " times" << endl; // 输出5 appears 1 times
// 使用生成算法fill
fill(v.begin(), v.end(), 0); // 将vector中的元素都填充为0,使用迭代器指定范围
for (int i = 0; i < v.size(); i++) {
// 遍历vector中的元素
cout << v[i] << " "; // 输出0 0 0 0 0
}
cout << endl;
```
迭代器是一种可以遍历容器中元素的对象,它提供了类似于指针的操作。STL提供了多种迭代器,根据功能可以分为几类:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等。例如:
```c++
#include <vector> // 引入vector头文件
using namespace std;
// 使用随机访问迭代器
vector<int> v = {1, 2, 3, 4, 5}; // 创建一个vector对象,并初始化为5个元素
vector<int>::iterator it; // 声明一个vector<int>类型的迭代器
it = v.begin(); // 将迭代器指向vector的第一个元素
cout << *it << endl; // 输出1
it++; // 将迭代器后移一位,指向vector的第二个元素
cout << *it << endl; // 输出2
it += 2; // 将迭代器后移两位,指向vector的第四个元素
cout << *it << endl; // 输出4
it = v.end(); // 将迭代器指向vector的最后一个元素的下一位
cout << *it << endl; // 输出不确定的值,可能是垃圾值或者报错
it--; // 将迭代器前移一位,指向vector的最后一个元素
cout << *it << endl; // 输出5
```
函数对象,也称为仿函数或者谓词,是一种可以像函数一样被调用的对象,它提供了一种传递函数或自定义行为的方式。STL提供了多种函数对象,根据功能可以分为几类:算术运算符、关系运算符、逻辑运算符、位运算符等。例如:
```c++
#include <functional> // 引入functional头文件
#include <algorithm> // 引入algorithm头文件
#include <vector> // 引入vector头文件
using namespace std;
// 使用算术运算符函数对象plus
int x = plus<int>()(10, 20); // 调用plus<int>类型的函数对象,返回两个int类型参数的和
cout << x << endl; // 输出30
// 使用关系运算符函数对象less
bool b = less<int>()(10, 20); // 调用less<int>类型的函数对象,返回两个int类型参数是否满足小于关系
cout << b << endl; // 输出1(true)
// 使用逻辑运算符函数对象logical_and
b = logical_and<bool>()(true, false); // 调用logical_and<bool>类型的函数对象,返回两个bool类型参数是否满足逻辑与关系
cout << b << endl; // 输出0(false)
// 使用位运算符函数对象bit_xor
x = bit_xor<int>()(10, 20); // 调用bit_xor<int>类型的函数对象,返回两个int类型参数的按位异或结果
cout << x << endl; // 输出30
// 使用自定义的函数对象
class MyFunc {
private: // 私有数据成员,只能在类内部访问
int n; // 一个整数
public: // 公有成员函数,可以在类外部访问
MyFunc(int n) {
// 构造函数,用于初始化对象
this->n = n; // 给整数赋值
}
bool operator()(int x) {
// 重载()运算符,使得对象可以像函数一样被调用
return x % n == 0; // 返回x是否能被n整除
}
};
vector<int> v = {1, 2, 3, 4, 5}; // 创建一个vector对象,并初始化为5个元素
int c = count_if(v.begin(), v.end(), MyFunc(2)); // 使用算法count_if和自定义的函数对象,计算vector中能被2整除的元素个数
cout << c << endl; // 输出2
```
本文介绍了C++标准模板库的主要内容,包括模板、容器、算法、迭代器、函数对象等组件。这些内容是C++编程中常用的数据结构和算法的集合,也是学习C++的必备内容。通过本文,你可以了解C++中如何使用标准模板库来存储和操作数据,以及如何利用标准模板库来编写通用、高效、可重用的代码。