当前位置: 首页 > news >正文

C++20: std::span

1. 简介

std::span提供了一种安全的访问线性连续数组的方法。

std::span可以用于std::vectorstd::array当然还有数组int []

2. 使用例子

std::span它能自动的推导出容器的大小。

#include <iostream>
#include <array>
#include <vector>
#include <span>int main()
{std::cout << std::endl;std::cout << std::boolalpha;std::vector myVec{1,2,3,4,5};std::span mySpan1{ myVec };std::span mySpan2{ myVec.data(), myVec.size()};bool spansEqual = std::equal( mySpan1.begin(), mySpan1.end(),mySpan2.begin(), mySpan2.end());std::cout << "mySpan1 == mySpan2: " << spansEqual << std::endl;int a[] = { 2,3,4,10};std::span mySpan3{ a };std::cout << mySpan3.size() << '\n';return 0;
}

同时能够使用data()来获取数据的原始指针,进而来修改变量。

std::spanstd::string_view有点类似,都可以看成一种

视图view,不过std::span它有修改数据的能力而string_view

没有。

但是比较坑的是,c++26之前std::span并不支持边界检查!!!

这意味着你仍然需要自己管理和检查边界。

下面的代码ptr[3]显然是越界了,但是程序的行为却是显示一个

垃圾值,这明显是一个未定义的行为。


#include <iostream>
#include <array>
#include <vector>
#include <span>int main()
{std::cout << std::endl;std::cout << std::boolalpha;int a[] = { 2,3,4,10};std::span mySpan3{ a };std::cout << mySpan3.size() << '\n';std::array<int,3> arr = { 6,5,4 };std::span mySpan4{ arr };auto ptr = mySpan4.data();std::cout << "mySpan4.size() = " << mySpan4.size() << '\n';std::cout << ptr[2] << '\n';std::cout << ptr[3] << '\n';return 0;
}

下面再给一个subspan的使用例子,其他的方法就不写了。

程序的意思是初始化一个0-19的数组,

再每5个连续数字输出一次。

// subspan.cpp#include <iostream>
#include <numeric>
#include <span>
#include <vector>int main() {std::cout << std::endl;std::vector<int> myVec(20);std::iota(myVec.begin(), myVec.end(), 0);                   // (1)for (auto v: myVec) std::cout << v << " ";std::cout << "\n\n";std::span<int> mySpan(myVec);                               // (2)auto length = mySpan.size();auto count = 5;                                             // (3)for (long unsigned int first = 0; first <= (length - count); first += count ) {for (auto ele: mySpan.subspan(first, count)) std::cout << ele << " ";std::cout << std::endl;}}

3. 参考

cppreference
moderncpp-span

http://www.dtcms.com/a/348667.html

相关文章:

  • 目标检测数据集 第005期-基于yolo标注格式的PCB组件检测数据集(含免费分享)
  • 【Ollama】本地OCR
  • 基于SpringBoot的校园信息共享系统【2026最新】
  • pod管理
  • scanner、arrylist、反转数组
  • FPGA 时序分析(五)
  • 十、redis 入门 之 redis事务
  • (Redis)主从哨兵模式与集群模式
  • 【机器学习】7 Linear regression
  • VScode设置鼠标滚轮调节代码
  • 嵌入式第三十六天(网络编程(TCP))
  • springboot项目搭建步骤
  • 【Flink】部署模式
  • Maven项目中settings.xml终极优化指南
  • Excel 表格 - 乘法与除法处理(保留两位小数四舍五入实现、保留两位小数截断实现、添加百分号)
  • 单片机外设(七)RTC时间获取
  • 深入解析Java NIO多路复用原理与性能优化实践指南
  • 重置MySQL数据库的密码指南(Windows/Linux全适配)
  • 基于springboot的理商管理平台设计与实现、java/vue/mvc
  • 得物25年春招-安卓部分笔试题1
  • Linux camera 驱动流程介绍(rgb: ov02k10)(chatgpt version)
  • AlmaLinux 上 Python 3.6 切换到 Python 3.11
  • EP02:【DA】数据分析的价值创造与应用流程
  • 基于SpringBoot的新能源汽车租赁管理系统【2026最新】
  • 【Linux文件系统】Linux文件系统与设备驱动
  • MySQL数据库精研之旅第十一期:打造高效联合查询的实战宝典(二)
  • python中的filter函数
  • 学习做动画1.简易行走
  • 人工智能之数学基础:离散型随机变量
  • 源滚滚React消息通知框架v1.0.2使用教程