C++ 中的 std::span::subspan 函数2025年5月14日 | 11 分钟阅读 std::span 类模板概述std::span 类模板是 C++20 中引入的一个全新的结构,它是一个轻量级的、非拥有的对象序列指针。它提供了一种访问数组或其中一部分的方式,而无需像指针那样复制数据,同时具有更安全、更方便的语义。以下是详细概述: 关键特性
使用 std::span 处理类数组数据的优势在 C++ 中使用 std::span 处理类数组数据提供了与 C++ 自身不同的重要优势,包括安全性、清晰度和性能。 提高类型安全性
简化的函数参数
示例 其他非专业视图(无内存管理考虑)
与标准容器的互操作性
示例 无复制或性能开销
理解 std::span::subspan 函数它是一个 span 创建实用函数,用于创建 std::span::subspan 或现有 std::span 的部分视图。此函数使您无需访问、更改或传输数据本身即可操作 span 所指示的数据的一部分。以下是该函数的详细描述、其参数及其工作原理: subspan() 的定义和语法subspan() 函数从现有的 std::span 中提取一个子 span,从指定偏移量开始,并可能包含给定数量的元素。 语法它具有以下语法:
该函数创建一个新的 std::span 对象,该对象表示从偏移索引开始的视图,并且可选地包含 count 个元素。 示例 subspan 的参数:Offset 和 CountOffset
Count(可选)
示例 返回值和行为返回类型:std::span<T> 该函数返回一个新的 std::span 对象,该对象表示原始 span 中元素的一个子集。 行为
边缘情况
越界行为示例 使用 std::span::subspan 的示例以下是一些演示如何使用 std::span::subspan 函数的示例,涵盖了基本用法和更具体的情况。 示例 1:创建 subspan 的基本示例此示例从一个 数组 创建一个 std::span,然后使用偏移量和计数提取一个 subspan。 输出 30 40 50 说明
示例 2:仅带偏移量的 Subspan当您仅提供偏移量时,subspan 将从指定偏移量到原始 span 末尾创建一个视图。 输出 4 5 6 说明
示例 3:同时带有偏移量和计数的 Subspan此示例通过指定偏移量和计数来创建 subspan,限制新 subspan 中的元素数量。 输出 10 15 20 25 说明
std::span::subspan 中的错误处理1. 处理越界错误默认情况下,std::span::subspan 方法不对偏移量值或相对于底层数据的计数执行任何范围检查。如果您提供了不正确的偏移量或请求的项目多于允许的数量,结果不是错误;而是会导致不可预测的行为。 越界错误示例
示例说明
如何避免越界访问手动验证偏移量和计数:由于 subspan() 默认不检查边界,因此您应该执行手动检查以确保偏移量和计数在有效范围内。 使用编译器标志或调试库: 某些编译器或环境提供有助于在调试构建中捕获越界访问的工具。这些运行时检查通常可用于 -D_GLIBCXX_DEBUG (GCC) 或 -D_LIBCPP_DEBUG (libc++) 等标志,这些标志启用了额外的安全检查。 2. 理解运行时检查(当 subspan 抛出异常时)尽管 std::span::subspan 不会自动抛出异常,但某些编译器可以在调试版本中或在设置了某些特殊标志时生成异常。这些运行时检查对于防止越界访问大有帮助,从而消除了未定义行为的可能性。 发生运行时检查时
启用运行时检查示例(GCC) 在 GCC 中,您可以通过使用 -D_GLIBCXX_DEBUG 进行编译来启用运行时检查 g++ -D_GLIBCXX_DEBUG my_program.cpp -o my_program 这将启用检查,如果创建了无效的 span,则会抛出异常(例如 std::out_of_range)。 带运行时检查的示例 说明
带调试标志的运行时检查示例 如果您使用的是提供边界检查的编译器或环境(例如带 -D_GLIBCXX_DEBUG 的 GCC),如果边界被违反,相同的代码将自动抛出异常。 结论总之,C++ 中的 std::span 类模板通过提供非拥有的、轻量级的连续内存视图,为处理多元素 对象 提供了一种更安全、更高效的方式。std::span::subspan 功能使用户能够在不使用额外数据副本的情况下从现有 span 创建子 span,同时确保值的安全性和清晰度。 但是,由于 std::span::subspan 没有内置的保护机制来防止访问越界数据,因此用户在使用偏移量和计数时必须小心。根据输入,程序员可以验证所有输入或打开运行时检查(例如,在某些编译器中打开调试标志),从而使代码更安全并消除未定义行为。 要点
下一主题C++ 中终止进程 |
八十边形数组由具有 80 条边的多边形的形数组成。八十边形数属于此类多边形的系列,即三角形、正方形等。这些数字中的数学和视觉模式也可以通过...进行解释。
7 分钟阅读
在 C++ 中,标准模板库 (STL) 是一组容器库以及实现处理集合中数据的各种算法的关联函数。用于操作向量的两个常用组件是 std::erase 和 std::vector::remove。尽管两者都用于...
阅读 4 分钟
杂耍算法是一种有用的 C++ 技术,它通过移动元素来执行旋转。它使用数组大小 n 和要旋转的位数 d 的最大公约数 (GCD) 将数组分成几组。之后,元素被...
5 分钟阅读
? 引言 在 C++ 中,信号用于向程序传达某个事件已发生。SIGABRT 是这样一个信号,它向进程发送一个需要中止的信号。这通常发生在程序执行 abort() 函数时,最常见的原因是错误...
阅读9分钟
在本文中,我们将讨论 C++ 中的 std::packaged_task 类及其语法、参数、成员函数和示例。C++ 中的 std::packaged_task 类是什么?在 C++ 中,可以封装并异步运行可调用对象,例如函数、lambda 表达式、绑定表达式和任何其他函数对象……
阅读 4 分钟
亏数是正整数,其真约数(不包括数字本身)之和小于该数字。例如,8 是亏数,因为它的约数(1、2、4)之和为 7,小于 8。输入:10 输出:亏数 输入:12 输出:...
阅读 4 分钟
著名的“抛鸡蛋问题”是一个著名的动态规划问题,需要使用动态规划来最优地解决。下面描述了这个著名的谜题涉及 N = 2 个鸡蛋和 K = 36 个楼层的情况。考虑一种情况,我们想要确定...
阅读 8 分钟
迷人数字简介迷人数字是数论中相当有趣的概念。这些数字在乘以某些数字时具有有趣的性质,例如产生包含 1 到 9 的所有数字恰好一次且顺序不尽相同的序列……
11 分钟阅读
在本文中,我们将讨论 C++ 中 rewinddir() 函数的语法、一些信息和示例。什么是 rewinddir() 函数?rewindir() 函数用于将目录流的位置恢复到目录的开头,dirp 必须调用 rewinddir() 函数。与 opendir() 函数类似,rewindir()...
阅读 3 分钟
DEFLATE,现代数据压缩的基石,巧妙地融合了两种关键算法的优点:LZ77(Lempel-Ziv 1977)和 Huffman 编码。它的威力不仅在于压缩率,还在于它能够平衡压缩速度和计算复杂性。让我们深入了解...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India