C++怎么使用span<T>或者span_p<T>

这篇文章主要介绍“C++怎么使用span或者span_p”,在日常操作中,相信很多人在C++怎么使用span或者span_p问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么使用span或者span_p”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

专注于为中小企业提供网站设计制作、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业中山免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

F.24:使用span或者span_p表示半开序列

半开是数学概念,指的是C++中的数组用[p:p+n)表示时,p指向第一个元素,而p+n则处于数组之外。

Reason(原因)

Informal/non-explicit ranges are a source of errors.

非正式的,不清楚的范围是错误之源。

Example(示例)

X* find(span r, const X& v);    // find v in r
vector vec;// ...auto p = find({vec.begin(), vec.end()}, X{});  // find X{} in ve
Note(注意)

在C++代码中,范围的概念特别常见。典型情况下,范围不会被明示而且很难确认是否被正常使用。尤其,给定一对表示参数(p, n)以表示数组[n:p+n),通常不可能知道p的后面是否真有n个元素可用。作为简单的辅助类,span用于表明范围[p:q),而span_p用于表示的范围开始于p,终止于第一个谓词为true的元素。

译者注:很遗憾没有找到span_p的用法示例。

Example(示例)

span表示元素的范围,但是我们怎么操作范围中的元素呢?

void f(span s){    // range traversal (guaranteed correct)    for (int x : s) cout << x << '\n';    // C-style traversal (potentially checked)    for (gsl::index i = 0; i < s.size(); ++i) cout << s[i] << '\n';    // random access (potentially checked)    s[7] = 9;    // extract pointers (potentially checked)    std::sort(&s[0], &s[s.size() / 2]);}
译者注:大致可以参考vector的用法。
Note(注意)

A span object does not own its elements and is so small that it can be passed by value.

span对象不会真正用于它的元素,小到可以直接传递对象。

Passing a span object as an argument is exactly as efficient as passing a pair of pointer arguments or passing a pointer and an integer count.

传递span对象作为参数和传递一对指针参数或者一个指针一个整数在高效性方面完全相同。

Enforcement(实施建议)

(复杂)当代码访问以整形值确定边界的指针类型参数时,报警并建议使用span代替。

到此,关于“C++怎么使用span或者span_p”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章标题:C++怎么使用span<T>或者span_p<T>
网页链接:http://myzitong.com/article/jsdege.html