广告位联系
返回顶部
分享到

C++20中的std::span介绍

C语言 来源:互联网 作者:佚名 发布时间:2023-03-05 08:20:54 人浏览
摘要

span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。 连续的存储,不一定是数组。例如: 1 2 3 4 5 6 7 8 zero(char (arr) [10]); //10个元素的数组, sizeof(arr)==10*sizeof(char)==10

span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。
连续的存储,不一定是数组。例如:

1

2

3

4

5

6

7

8

zero(char (&arr) [10]);  //10个元素的数组, sizeof(arr)==10*sizeof(char)==10

zero(char arr[]);  //arr退化为指针, sizeof(arr)==sizeof(char*)

zero(char *arr, size_t n);  //处理任意含n个char的连续内存

  

void main(){

    char* pc = new char[10];

    zero(pc,10);  //连续内存,但不是数组

}

为了程序的复用性,我们一般使用zero(char* arr, size_t n);这种函数签名。

1

2

template<size_t N>

void zero(char (&arr)[N]) ;

这种模板形式虽然比只能处理char[10]这种类型的zero函数,适用性大一些,但是它仍不能处理广义上的连续char内存。
zero(char*arr, sizr_t n)的灵活性是有了,问题是用户(调用者)可能把n填错。例如:

1

2

char aa[10];

zero(aa,20);

为了解决这个问题,我们需要写很繁琐的代码:

1

2

3

4

5

char aa[10];

std::array<char,10> bb;

  

zero(aa,sizeof(aa)/sizeof(aa[0]));

zero(bb.data(),bb.size());

有了std::span, 我们可以:

1

2

3

4

5

6

7

8

9

10

void zero( std::span<char> sp ){

    size_t n = sp.size();

    sp[n-1]=0; //当数组越界时,仍可能引发事故。

}

  

char aa[10];

std::array<char,10> bb;

   

zero(aa);

zero(bb);  //简化,统一

我们可以手工粗陋的制作一个span类,虽然它不符合STL容器规范,但是可以看出主要核心骨架

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

// This file is a "Hello, world!" in C++ language by GCC for wandbox.

#include <iostream>

#include <cstdlib>

#include <array>

  

template<class T>

class span{

public:

    template<size_t N>

    span(T (&arr)[N]){

        arr_ = arr;

        n_ = N;

    }

     

    template<size_t N>

    span(std::array<T,N>& arr){

        arr_ = arr.data();

        n_ = N;

    }

     

    span(T* arr,size_t n){

        arr_ = arr;

        n_ = n;

    }

     

    T* data(){ return arr_;}

    size_t size(){ return n_;}

     

private:

    T* arr_;

    size_t n_;

};

  

void zero( span<char> sp ){

     

    char* arr = sp.data();

    size_t n = sp.size();

    arr[n-1]=0;

}

  

int main()

{

    char aa[10];

    std::array<char,10> bb;

     

    size_t n=10;

    char* pc = new char[n];

    zero(aa);

    zero(bb);

    zero({pc,n});

    

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/audi2/article/details/104010652
相关文章
  • C++20中的span容器及用法总结
    一.span容器 span是 C++20 中引入的一个新的标准容器,它用于表示连续的一段内存区间,类似于一个轻量级的只读数组容器。 span是一个轻量级
  • C++20中的std::span介绍
    span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。 连续的存储,不一定是数组。例如: 1 2 3 4 5 6 7 8 zero(char (arr) [10]
  • C++11之std::future对象的使用以及说明

    C++11之std::future对象的使用以及说明
    std::future介绍 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。 但是我们想要从线程中返回异步任务结果,
  • C语言中#define在多行宏定义出错的原因及分析
    C语言中#define在多行宏定义出错的原因 1.第一种错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #includestdio.h #define echange(a,b) {\/*宏定义中允许包含多行命
  • vs2022 x64 C/C++和汇编混编(案例代码)

    vs2022 x64 C/C++和汇编混编(案例代码)
    vs2022环境x64 C/C++和汇编混编 vs64位程序不支持__asm内嵌汇编,需要单独编写汇编源文件 示例如下 1、新建空的win32项目,新建main.cpp,示例代码
  • C语言中带返回值的宏定义方式
    C语言中带返回值的宏定义 相信大家在实际工作中,一定有遇到需要编写一个宏定义,且希望它能带返回值的场景吧? 比如我之前就遇到一
  • OpenCV实现视频绿幕背景替换功能
    1、概述 案例:使用OpenCV实现视频绿幕背景替换 算法步骤: 1.初始化VideoCapture并使用其open方法加载视频 2.while循环加读取frame capture.read(fra
  • OpenCV通过透视变换实现矫正图像介绍

    OpenCV通过透视变换实现矫正图像介绍
    1、概述 案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现
  • 一篇文章彻底搞懂C++常见容器

    一篇文章彻底搞懂C++常见容器
    1.概述 C++容器属于STL(标准模板库)中的一部分(六大组件之一),从字面意思理解,生活中的容器用来存放(容纳)水或者食物,东西,
  • C语言通过二分查找实现猜数字游戏

    C语言通过二分查找实现猜数字游戏
    二分查找 题目: 在一个有序数组中查找具体的某个数字n。 首先我们先定义一个110的数组 ,如果7为我们要查找的数字,编写代码如下 1 2
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计