<返回更多

C++标准模板库:让你轻松使用各种数据结构和算法

2023-08-09    霸都嵌入式
加入收藏

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++中如何使用标准模板库来存储和操作数据,以及如何利用标准模板库来编写通用、高效、可重用的代码。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>