栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

stdspan ---C++20

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
#include 
#include 
#include 
#include 

void printSpan(std::span 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 dynamicSpan(v1);
	std::span 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 dynamicSpan(v1); // 默认构造
	std::span staticSpan(v2);

	std::span undefineSpan(v2); // 未定义行为 2 != 6

	std::span iteratorSpan1(v1.begin(), v1.end());
	std::span iteratorSpan2(v1.begin()+1, v1.end());

	std::span iteratorsizeSpan3(v1.begin(), 6); // iterator + size

	int cArray[5]{ 1, 2, 3, 4, 5 };
	std::array cppArray{ 1, 2, 3, 4, 5 };

	std::span cArrSpan(cArray);
	std::span cppArrSpan{cppArrSpan};
	std::span cppArrSpan1{cppArrSpan};
}

  • std::span 在构造时不支持隐式类型转换
  • std::span可以推断C-stye数组的大小
修改

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

#include 
#include 
#include 
#include 
#include 
#include 

void printSpan(std::span 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976830.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号