【C++STL基础入门】排序和遍历容器

简介: 【C++STL基础入门】排序和遍历容器

前言


STL(Standard Template Library)是C++的标准库之一,提供了丰富的容器、迭代器和算法等组件,方便了C++开发者进行快速而高效的编程。其中,for_each和sort是STL中两个有用的小算法,用于对容器中的元素进行遍历和排序。本文将介绍这两个算法的概念、函数原型,并给出相应的示例代码,使用string类作为示例。


使用前须知


头文件

我们需要使用头文件#include <algorithm>


一、for_each算法


1.1 for_each是什么

for_each算法用于对容器中的元素逐个进行处理操作,它接受一个函数对象作为参数,并将容器中的每个元素传递给函数对象进行处理。


1.2 函数原型

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);


参数3的函数可以参数可以是容器的类型,也可以是容器

8c3d28e2bfa741688e30aecc9605e59f.png

1.3 示例代码1:将容器中的每个元素打印出来

#include <iostream>
#include <string>
#include <algorithm>
void printElement(const std::string& elem) {
    std::cout << elem << " ";
}
int main() {
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "David"};
    std::for_each(names.begin(), names.end(), printElement);
    return 0;
}


e931ccd2f22d4a7ebb0841f8fd8243b1.png

示例代码1演示了如何使用for_each算法将容器names中的每个元素打印出来。首先定义了一个函数printElement,它将一个字符串作为参数并打印它。然后,在main函数中调用for_each算法,传入names.begin()和names.end()来指定元素范围,并将printElement作为函数对象进行处理。执行该代码,会输出:Alice Bob Charlie David,每个元素以空格分隔。


1.4 示例代码2:将容器中的每个字符串转换为大写形式

#include <iostream>
#include <string>
#include <algorithm>
void toUpper(std::string& elem) {
    std::transform(elem.begin(), elem.end(), elem.begin(), ::toupper);
}
int main() {
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "David"};
    std::for_each(names.begin(), names.end(), toUpper);
    for (const std::string& elem : names) {
        std::cout << elem << " ";
    }
    return 0;
}


8f11da4bded44539a55e30c07d91a59a.png

示例代码2展示了如何使用for_each算法对容器names中的每个元素进行大写转换操作。我们定义了一个函数toUpper,它接受一个字符串的引用,并使用std::transform将字符串中的字符转换为大写形式。然后,在main函数中调用for_each算法,将names.begin()和names.end()指定的元素范围传递给算法,并将toUpper作为函数对象进行处理。最后,我们遍历names并打印结果:ALICE BOB CHARLIE DAVID。


二、sort算法


2.1 sort算法是什么?

sort算法用于对容器中的元素进行排序操作,可以按升序或降序排列。


2.2 函数原型

template<class RandomIt>
void sort(RandomIt first, RandomIt last);
template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);


6e38eaf8433a431995cbaaf9af9529d5.png

2.3 示例代码1:按升序排序容器中的字符串

#include <iostream>
#include <string>
#include <algorithm>
int main() {
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "David"};
    std::sort(names.begin(), names.end());
    for (const std::string& elem : names) {
        std::cout << elem << " ";
    }
    return 0;
}


e81e8dc842754443a0824b9ab2443763.png

示例代码1展示了如何使用sort算法按升序对容器names中的字符串进行排序。调用sort算法,传入names.begin()和names.end()指定的元素范围。执行该代码,会输出:Alice Bob Charlie David,即按照字母顺序排序的结果。


2.4示例代码4:按降序排序容器中的字符串

#include <iostream>
#include <string>
#include <algorithm>
bool compare(const std::string& a, const std::string& b) {
    return a > b;
}
int main() {
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "David"};
    std::sort(names.begin(), names.end(), compare);
    for (const std::string& elem : names) {
        std::cout << elem << " ";
    }
    return 0;
}


00cf99a74ad544f48d86cced0551fcf1.png

示例代码2展示了如何使用sort算法按降序对容器names中的字符串进行排序。我们定义了一个自定义比较函数compare,它接受两个字符串参数并比较它们的字典顺序。在调用sort算法时,传递了compare作为比较函数,以便在排序时按照降序进行排序。执行该代码,会输出:David Charlie Bob Alice,即按照字母逆序排序的结果。


总结


本文介绍了STL中的两个小算法:for_each和sort。for_each算法用于对容器中的元素进行遍历和处理操作,sort算法用于对容器中的元素进行排序。通过示例代码的演示,我们了解了这两个算法的概念、函数原型以及用法,并使用string类作为示例进行说明。这些算法在实际开发中很常用,能够极大地简化对容器的操作和排序需求。希望本文对你理解和使用STL算法有所帮助!

相关文章
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
31 0
|
18天前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
13 1
|
24天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
32 2
|
1月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
17天前
|
Cloud Native 持续交付 Docker
云原生之旅:Docker容器化实战指南
【8月更文挑战第29天】本文将引领你进入云原生技术的世界,以Docker容器化为切入点,深入浅出地介绍如何利用Docker进行应用的打包、部署及管理。我们将通过实际代码示例,一步步展示Docker镜像的构建过程,以及如何运行和管理这些容器。无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的知识和实操经验。
|
12天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
12天前
|
应用服务中间件 nginx Docker
Docker同一台宿主机容器通信-通过容器名称互联
本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。
21 1
Docker同一台宿主机容器通信-通过容器名称互联
|
2天前
|
运维 Docker 微服务
掌握 Docker Compose:简化你的多容器应用部署
在微服务架构和容器化技术普及的今天,管理多容器部署变得颇具挑战。Docker Compose 通过一个 YAML 文件定义和运行多容器应用,简化了部署和运维。本文介绍其基本概念、使用方法及优势,包括服务、项目、卷和网络等核心概念,并提供从安装到管理服务的详细步骤,助你轻松掌握 Docker Compose,提高开发效率和应用运维质量。
|
1天前
|
弹性计算 运维 持续交付
探索Docker容器化技术及其在生产环境中的应用
探索Docker容器化技术及其在生产环境中的应用
11 5
|
1天前
|
Cloud Native 持续交付 Docker
探索容器化技术Docker的奥秘
探索容器化技术Docker的奥秘
12 3