stdspan ---C++20

std::span —C++20

std::span的定义

template<class T,std::size_t Extent = std::dynamic_extent
> class span;

std::span是指向一组连续的对象的对象, 是一个视图view, 不是一个拥有者owner

一组连续的对象可以是 C 数组, 带着大小的指针, std::array, 或者 std::string

std::span可以有两种范围:

  • 静态范围static extend
  • 动态范围dynamic extend

静态范围, 动态范围

**静态范围static extent: **编译期就可以确定大小

**动态范围dynamic extend: ** 由指向第一个对象的指针和连续对象的大小组成

#include <ranges>
#include <vector>
#include <iostream>
#include <span>
#include <format>void printSpan(std::span<int> container)
{std::cout << std::format("container size: {} \n", container.size());for (auto ele : container){std::cout << ele << " ";}std::cout << std::endl;std::cout << std::endl;
}int main()
{std::vector v1{1, 2, 3, 4, 5, 8};std::vector v2{9, 2, 4, 2, 6, 78};std::span<int> dynamicSpan(v1);std::span<int, 6> staticSpan(v2);printSpan(dynamicSpan);printSpan(staticSpan);
}

构造

  • 默认构造 template< class T, std::size_t Extent = std::dynamic_extent > class span;
  • 使用迭代器(std::contiguous_iterator)
  • 迭代器 + 大小
  • C-stye数组

int main()
{std::vector v1{1, 2, 3, 4, 5, 8};std::vector v2{9, 2, 4, 2, 6, 78};std::span<int> dynamicSpan(v1); // 默认构造std::span<int, 6> staticSpan(v2);std::span<int, 2> undefineSpan(v2); // 未定义行为 2 != 6std::span<int> iteratorSpan1(v1.begin(), v1.end());std::span<int> iteratorSpan2(v1.begin()+1, v1.end());std::span<int> iteratorsizeSpan3(v1.begin(), 6); // iterator + sizeint cArray[5]{ 1, 2, 3, 4, 5 };std::array<int, 5> cppArray{ 1, 2, 3, 4, 5 };std::span<int> cArrSpan(cArray);std::span<int> cppArrSpan{cppArrSpan};std::span<int,5> cppArrSpan1{cppArrSpan};
}
  • std::span 在构造时不支持隐式类型转换
  • std::span可以推断C-stye数组的大小

修改

可以修改std::span的指向,或者修改子集

#include <ranges>
#include <vector>
#include <iostream>
#include <span>
#include <format>
#include <array>void printSpan(std::span<int> container)
{std::cout << std::format("container size: {} \n", container.size());for (auto ele : container){std::cout << ele << " ";}std::cout << std::endl;std::cout << std::endl;
}int main()
{std::cout << '\n';std::vector vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};printSpan(vec);std::span span1(vec);std::span span2{span1.subspan(1, span1.size() - 2)};std::transform(span2.begin(), span2.end(),span2.begin(),[](int i) { return i * i; });printSpan(vec);printSpan(span1);
}

std::span - cppreference.com

std::basic_string_view - cppreference.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2. Get the codes from GIT

Clone the code from git. Click the “GitEx Clone”. Paste the url into the “Repository to clone”. You can get the route from git repository from it: https://msstash.companydomainname.com/ .Find the project which you want to download and then click the “…

按钮控件数组

Public Class ButtonArray Inherits System.Collections.CollectionBase Private ReadOnly HostForm As System.Windows.Forms.Form 创建类的构造函数。 Visual Basic Public Sub New(ByVal host As System.Windows.Forms.Form) HostForm host Me.Add…

c/c++面试试题(二)

21. New delete 与malloc free 的联系与区别?答案&#xff1a;都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象&#xff0c;new 会自动调用对象的构造函数。delete 会调用对象的destructor&#xff0c;而free 不会调用对象的des…

The Ranges Library (2) --- C++20

The Ranges Library (2) — C20 比较std与std::ranges算法 比较一下std::sort和std::ranges::sort std::sort template< class RandomIt > constexpr void sort( RandomIt first, RandomIt last );template< class ExecutionPolicy, class RandomIt > void sor…

react(79)--ant design确认框

<Popconfirmplacement"rightBottom"title{text}onConfirm{confirm}okText"Yes"cancelText"No"><Button>RB</Button></Popconfirm>

程序中的得与失

俗话说&#xff0c;舍得&#xff0c;有舍便有得&#xff0c;程序或许和世间万物一个样&#xff0c;讲究阴阳平衡。或许您写程序过程中&#xff0c;得到一颗歪脖树&#xff0c;却放弃了一大片大森林&#xff0c;能正确的取舍矛盾体双方的关系&#xff0c;或许是您扎实功底的体现…

[转]新东方老师上课讲的笑话(太有才了)

[张洪伟] 起名字的问题&#xff1a;中西方都不愿意以鲜花、野草起名字&#xff0c;什么牡丹玫瑰&#xff0c;小红小翠了&#xff0c;一听就变味了&#xff1b;张建、李建&#xff0c;但不能叫范建&#xff08;贱&#xff09;了&#xff1b;北京以前有个建&#xff08;贱&#x…

c/c++面试试题(三)

慧通&#xff1a; 什么是预编译何时需要预编译&#xff1a;&#xff11;、总是使用不经常改动的大型代码体。 &#xff12;、程序由多个模块组成&#xff0c;所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下&#xff0c;可以将所有包含文件预编译为一个预编译…

mysql安装使用--2 用户管理

1 修改mysql.user表 添加用户 mysql> INSERT INTO mysql.user (Host,User,Password) VALUES (\%\,\system\, PASSWORD(\manager\)); mysql> FLUSH PRIVILEGES 2 create 和 grant命令省略 3 user表内容 MySQL用户名由两部分组成&#xff1a;(user, host)&#xff0c;二者…

constexpr if --- C++ 20

constexpr if — C 20 constexpr if 可以让我们实现条件编译 template <typename T> auto getResult(T t) {if constexpr (std::is_integral_v<T>)return *t;elsereturn t; }如果T是intergral类型,执行第一个分支,否则执行第二个分支 还记得前文写过的模板元编程…

WPF中的动画

WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一&#xff0c;其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard&#xf…

c/c++面试试题(四)

華為1、局部变量能否和全局变量重名&#xff1f;答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff0c;需要使用"::"局部变量可以与全局变量同名&#xff0c;在函数内引用这个变量时&#xff0c;会用到同名的局部变量&#xff0c;而不会用到全局变量…

[访问系统] Api_Win32_Mac类工具包 (转载)

点击下载 Api_Win32_Mac.zip using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices;namespace BaseFunction {class API{[DllImport("kernel32")]//内存public static extern void GlobalM…

constexpr 函数

constexpr 函数 — C 20 constexpr double pi 3.14;constexpr允许你在编译时使用典型的C函数语法进行编程,但这并不意味之constexpr只和编译期有关 constexpr函数可以在编译期运行,也可以在运行时运行 但在以下情况constexpr函数必须在编译期运行: constexpr函数在编译的上…

react(82)--方法写在effects里面

effects: {*addOrUpdateAssistActivity({ payload, callback }, { call }) {try {const res yield call(addOrUpdateAssistActivity, payload);if (callback && typeof callback function) {yield callback(res);}} catch (error) {console.log(error);}},

让VS2005用起来更顺手

1. 在解决方案资源管理器中跟踪活动项VS2005 工具 选项 项目和解决方案 常规&#xff0c;把“在解决方案资源管理器中跟踪活动项”打勾。2. 显示行号VS2005 工具 选项 文本编辑器 C#&#xff0c;把“行号”打勾。或者 VS2005 工具 选项 文本编辑器 所有语言&…

C++面试题目(五)

思科1. 用宏定义写出swap&#xff08;x&#xff0c;y&#xff09;#define swap(x, y)/x x y;/y x - y;/x x - y;2.数组a[N]&#xff0c;存放了1至N-1个数&#xff0c;其中某个数重复一次。写一个函数&#xff0c;找出被重复的数字.时间复杂度必须为o&#xff08;N&#xff…

如何利用脚本方法清除文本框中汉字,从而保留英文字母和数字等

脚本方法如下&#xff1a; <script language"javascript" type"text/javascript"> function RemoveChineseCharacters(teleriktextboxID) {var textboxinput document.getElementById(teleriktextboxID);var textboxinputhidden document.g…

react(83)--filter

let newarr friendTableSource.filter(function(item, index, arr0) {return item.code ! val;});