当前位置: 首页 > 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.xdnf.cn/news/1358371.html

相关文章:

  • 多线程下单例如何保证
  • elasticsearch 7.x elasticsearch是查询的数据量大于10000分页有问题还是es的库总量大于10000分页有?
  • 【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
  • 安装gitlab
  • Dify 从入门到精通(第 53/100 篇):Dify 的分布式架构(进阶篇)
  • 线程整理文档
  • git学习
  • Wagtail CRX 的 Latest Pages Block 高级设置 模版v3.0 以后被阉割了
  • Vue vs React:前端框架的差异与选择
  • 【SpringBoot集成篇】SpringBoot 深度集成 Elasticsearch 搜索引擎指南
  • 代码性能测试——benchmark库
  • 基于Spring Boot与Redis的电商场景面试问答解析
  • Python训练营打卡 DAY 46 通道注意力(SE注意力)
  • 【数据结构】排序算法全解析
  • Linux服务实验
  • [论文阅读] 软件工程 | GPS算法:用“路径摘要”当向导,软件模型检测从此告别“瞎找bug”
  • Kaggle项目:一次 Uber 出行数据分析的完整思路
  • 【机器学习】 11 Mixture models and the EM algorithm
  • 如何捕获组件的异常情况
  • Node.js依赖管理与install及run命令详解
  • Redis实战-缓存的解决方案(一)
  • Flink直接缓冲存储器异常解析与解决方案
  • comfyUI背后的一些技术——CLIP
  • 暗影哨兵:安全运维的隐秘防线
  • 高并发AI服务部署方案:vLLM、TGI、FastChat性能压测报告
  • 使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序
  • QML Charts组件之坐标轴示例
  • maven私服架构
  • Tesla智能座舱域控制器(MCU)的系统化梳理
  • ChainVault:重塑亚洲黄金交易基建,引领RWA金融新浪潮