C++ std::ranges::in_found_result2025年2月11日 | 阅读 9 分钟 C++ 经历了多次改动并增加了更多功能,这反过来使该语言更加灵活。这是近年来最显著的改进之一;ranges 是 C++20 的全新概念。Ranges 是思考数据序列的更逻辑、更可用的方式;它们将数据结构(如数组或vector)以及对它们的操作封装到一个单一的实体中。这种演变改变了开发人员处理数据集合的方式,使代码更具可读性和可写性,更高效,并且不易出错。 在引入 ranges 之前,使用 C++ 中的迭代器操作序列主要需要大量的前置迭代器操作,这使得生成的代码庞大且容易出错。例如,让我们看一个我们要在列表中实现的简单操作。没有 ranges,这可能需要编写直接操作迭代器的代码,这可能不太灵活和直观,尤其是在一个人不太熟悉 C++ 的情况下。
什么是 in_found_result?in_found_result 类型是在 ranges 和 C++ 标准库中一些与范围搜索相关的过程中使用的一种返回类型。该类型旨在包含算法的结果,该算法除了返回元素的位置之外,还需要携带一些额外的信息。 在详细讨论 in_found_result 之前,应解释其功能和组成部分。该类型的主要目的是在执行涉及元素搜索的操作时,获得更模糊、更有用的答案。例如,考虑 ranges::find 算法。此算法查找范围中的确定数量,并且必须提供有关数量是否找到以及如果找到,在哪里找到的信息。 传统上,像 std::find 这样的算法会在元素所在的位置返回一个迭代器。否则,它会在范围的末尾返回一个迭代器。虽然这可以工作,但在某些情况下可能有些受限。ranges 库引入的 in_found_result 类型通过返回一个更具表现力的结果来增强这一点,该结果包含两个关键信息:
这两个成员共同提供了比单个迭代器更强大、更丰富的结果,在 in_found_result 类型推断的情况下。它使得开发人员能够立即获得搜索结果,而无需手动与范围末尾进行比较。 C++ 中 in_found_result 的用例在 C++ 接口中,当您想要有关范围内的搜索操作的更详细信息时,in_found_result 返回类型可能会更有帮助。以下是 in_found_result 可以有效应用的几个关键场景: 1. 根据搜索进行条件操作在范围内搜索以查找元素时,大多数情况下会关联一些条件操作。例如,如果找到一个元素,通常希望更改它或进行更多操作。在元素缺失时用空白或下划线标记是一个好主意,或者可能希望插入它。in_found_result 通过返回一个布尔值(如果找到元素则为 true,并返回到该位置的迭代器,否则返回 null)使这更加简单。 2. 避免冗余操作为了在传统 C++ 搜索算法中实现后者,执行搜索后,必须将返回的迭代器与搜索范围的最后一个元素进行比较,以确定是否找到该元素。这反过来又引入了更多的工作、时间和出错的可能性。在 in_found_result 中,搜索结果包含在此信息中,因此无需重复比较,从而使代码干净且无错误。 3. 增强的调试和日志记录能够立即获得搜索结果和搜索停止的位置通常非常有用。in_found_result:在搜索操作失败的情况下,它允许您记录搜索停止的确切时刻,从而可以更详细地评估程序的行为。在数据流通过算法的分析至关重要的系统中,这可能尤为重要。 示例输出 Element 40 found at position: 3 Value doubled. New value: 80 Final vector contents: 10 20 30 80 50 60 说明
使用 in_found_result 的优点1. 增强代码清晰度这是因为 C++ 的 in_found_result 等功能清晰明了,并增加了代码的清晰度。处理搜索后值的一般技术是使用迭代器,通过与范围的末尾进行比较来查看是否找到了元素。这会使代码相当难以阅读,尤其是在 C++ 新手或处理大型项目时。in_found_result 包含迭代器和布尔值,它们比仅有迭代器具有更多的解释性,使代码一眼就能轻松理解。 2. 减少错误的可能性因此,in_found_result 通过将迭代器和成功指示器打包到一个返回类型中,提供了免受多种潜在错误的影响。在传统 C++ 代码中,经常使用迭代器对象。但是,这种对象的有效性只能在其工作期间进行检查,这通常会导致在其工作过程中出现错误。使用 in_found_result 中的 found 布尔值允许开发人员在对迭代器执行操作之前检查元素是否已找到,从而最大限度地减少错误发生。 3. 简化的条件逻辑在 found 结果中,可以根据搜索结果编写条件逻辑,这非常方便。与其编写迭代器与范围末尾的比较代码,不如使用布尔值“found”来分割逻辑。这不仅减少了代码行数,而且以更“自然”的方式做到这一点,因为代码的目的是也更清晰。 4. 改进的可维护性尤其是在更大的项目或团队环境中,可维护性方面非常重要。使用 in_found_result 使代码中与搜索相关的部分更具描述性,从而提高了可维护性。未来将处理代码的人员将只知道代码的作用,而无需深入了解迭代器比较的工作细节;因此,他们在更新代码时不会犯几个错误。 使用 in_found_result 的缺点1. 简单情况下的复杂性增加尽管 in_found_result 在需要迭代器和成功状态的情况下很有用,但它的使用会给更简单的用例带来不必要的混乱。例如,如果在给定任务中,一个人只需要知道一个元素是否属于某个范围,并且不需要使用迭代器,那么 in_found_result 可能会过度复杂化任务,而不会在效率或有效性方面获得任何收益。在这些情况下,也可以使用更简单的返回类型,如可选的比较或直接的迭代器比较。 2. 性能关键型应用的开销因此,即使是微小的开销在性能关键型应用中也可能变成严重的问题。由于 in_found_result 绑定到 struct_type 并与迭代器和布尔值一起返回,虽然这种开销通常很小,但在性能关键的特殊情况下,以及每当搜索操作在几行代码的循环中执行时,可以设想 struct 的创建及其成员的访问与简单数据类型相比会产生轻微的惩罚。 3. 用例有限因此,在需要结果及其位置的搜索操作的情况下,in_found_result 表现出色。在许多情况下,开发人员只需要其中一项信息。例如,如果客户端只关心某个元素是否存在,那么返回一个布尔值就足够了。另一方面,如果您只需要迭代器,那么布尔值可能甚至不存在。在这些情况下,因此,in_found_result 很可能是过度的,并且可能存在更简单的解决方案。 结论总之,in_found_result 改进了 C++ 代码的可读性以及搜索操作的返回类型,该返回类型由迭代器和布尔字段组成。这降低了出错的可能性,使条件的使用更加直接,并使代码更易于维护。但在其他情况下,当不完全需要时,它可能会增加额外的代码,并且在最坏的情况下,在重要应用中可能对性能产生边际影响。对于大多数用例,尤其是对于细粒度搜索结果有用的情况,in_found_result 是有效的,它体现了现代 C++ 的特性。它还有助于学习使用它的可能性、它的缺点和局限性,这些都有助于生成更紧凑、更易读的代码,并了解它的适用性。 |
在本文中,我们将讨论 C++ 和 Prolog 之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 和 Prolog 及其主要功能。什么是 C++?C++ 是由 Bjarne Stroustrup 于 1983 年开发的高性能通用语言,扩展了 C 语言...
7 分钟阅读
在本文中,我们将讨论循环依赖,这是一种当两个或多个实体(模块/类/组件)直接或间接相互依赖的条件。换句话说,当一个模块或组件的执行或编译需要另一个模块作为先决条件时,就会出现循环依赖...
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 Emirp 数及其过程和示例。什么是 Emirp 数?Emirp 数是一个素数但不是回文数,并且即使数字反转后仍然是素数...
阅读 3 分钟
反向 DNS 查找是从给定 IP 地址检索关联域名的过程。在 C++ 中实现反向 DNS 查找缓存涉及创建一个数据结构来存储各种查找的结果,这可以通过避免重复来显著提高性能……
阅读 23 分钟
引言 排序可以被认为是计算机科学中的一项基本操作,旨在对主要数据进行排序。例如,各种排序算法以一种或另一种方法应用,它们具有独特的性能指标。例如,珠子排序(也称为重力排序)结合了...
阅读 10 分钟
在本文中,我们将讨论 std::transform_inclusive_scan() 函数,包括其语法、参数、示例和优点。什么是 std::transform_inclusive_scan() 函数?除了首先应用于每个输入项的一元函数之外,transform_inclusive_scan() 函数是一个 C++ 内置函数,其功能与...类似。
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 Std::codecvt_out 和 Std::do_out 函数及其特性、示例、优点和缺点。引言:自创建以来,文本处理和字符编码一直是 C++ 的核心。随着该语言的发展,其方法也为...
阅读 6 分钟
在本文中,我们将讨论其特性、示例和用例。什么是 std::knuth_b() 函数? std::knuth_b 是 C++ 标准库中可用的一种随机数生成器,以著名的计算机科学家 Donald E. Knuth 的名字命名。它位于 <random>...中。
阅读 4 分钟
引言 在黄金比例之后,Wythoff 序列是组合博弈论中用于玩家移动的数学组合。它以 Willem Abraham Wythoff 的名字命名,他根据具有与黄金分割的奇特关系的斐波那契数列创建了一个序列。在这个...
阅读 15 分钟
递归是计算机科学和编程的核心概念之一,其中函数调用自身以解决给定问题。该方法在解决可以分解为多个具有相同解决方案的相似问题的方面非常有效。迭代...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India