您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

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

时间:2023-08-09 13:59:23  来源:  作者:霸都嵌入式

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



Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  Search: C++  点击:(4)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25  Search: C++  点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  Search: C++  点击:(21)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03  Search: C++  点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  Search: C++  点击:(113)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  Search: C++  点击:(111)  评论:(0)  加入收藏
指针变量在C/C++中的内存占用
在编程领域,尤其是C和C++这类底层语言中,指针是一个核心概念,它允许程序直接操作内存地址。然而,关于指针本身在内存中占用的空间大小,却常常让初学者感到困惑。本文将深入探讨这...【详细内容】
2024-01-09  Search: C++  点击:(95)  评论:(0)  加入收藏
C++的面向对象编程:深入解析与理解
当我们谈论C++时,面向对象编程(OOP)是一个无法回避的话题。那么,C++的面向对象究竟是什么?为什么它如此重要?本文将从基本概念到实际应用,为您详细解析C++中的面向对象编程。一、面...【详细内容】
2024-01-03  Search: C++  点击:(95)  评论:(0)  加入收藏
有什么好用的C/C++源代码混淆工具?
开始使用ipaguard前言iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP...【详细内容】
2023-12-29  Search: C++  点击:(118)  评论:(0)  加入收藏
C++中new与malloc:内存分配机制深度解析
本文旨在深入探讨C++中new和malloc两种内存分配机制的区别。通过对比它们在内存分配、初始化、错误处理、调用构造函数/析构函数、类型转换和使用便捷性等方面的不同,我们将...【详细内容】
2023-12-27  Search: C++  点击:(127)  评论:(0)  加入收藏
▌简易百科推荐
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(4)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(21)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(113)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(67)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(111)  评论:(0)  加入收藏
C# 登顶!超越Java或非空想
整理丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)近日,TIOBE编程社区公布年度编程语言,此次摘得这一桂冠的是C#。这也是C#在TIOBE二十多年评选历史中首次赢得这一年度大奖。C#虽...【详细内容】
2024-01-15    51CTO  Tags:C#   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条