什么是“跨度"?我什么时候应该使用一个?

What is a quot;spanquot; and when should I use one?(什么是“跨度?我什么时候应该使用一个?)

本文介绍了什么是“跨度"?我什么时候应该使用一个?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近我收到了在我的代码中使用 span<T> 的建议,或者在使用 span 的网站上看到了一些答案 -据说是某种容器.但是 - 我在 C++17 标准库中找不到类似的东西.

Recently I've gotten suggestions to use span<T>'s in my code, or have seen some answers here on the site which use span's - supposedly some kind of container. But - I can't find anything like that in the C++17 standard library.

那么这个神秘的 span<T> 是什么?为什么(或何时)使用它是非标准的好主意?

So what is this mysterious span<T>, and why (or when) is it a good idea to use it if it's non-standard?

推荐答案

是什么?

A span 是:

  • 对内存中某处 T 类型的连续值序列的非常轻量级的抽象.
  • 基本上是一个 struct { T * ptr;std::size_t 长度;} 有很多方便的方法.
  • 非拥有类型(即引用类型" 而不是值类型"):它从不分配或解除分配任何东西,也不使智能指针保持活动状态.
  • A very lightweight abstraction of a contiguous sequence of values of type T somewhere in memory.
  • Basically a struct { T * ptr; std::size_t length; } with a bunch of convenience methods.
  • A non-owning type (i.e. a "reference-type" rather than a "value type"): It never allocates nor deallocates anything and does not keep smart pointers alive.

它以前称为 array_view,甚至更早称为 array_ref.

It was formerly known as an array_view and even earlier as array_ref.

首先,当使用它时:

  • 不要在可能只需要任何一对 start & 的代码中使用它.结束迭代器,例如 std::sortstd::find_ifstd::copy 和所有这些超通用模板化函数.
  • 如果您有一个标准库容器(或 Boost 容器等)并且您知道它适合您的代码,请不要使用它.它无意取代其中任何一个.
  • Don't use it in code that could just take any pair of start & end iterators, like std::sort, std::find_if, std::copy and all of those super-generic templated functions.
  • Don't use it if you have a standard library container (or a Boost container etc.) which you know is the right fit for your code. It's not intended to supplant any of them.

现在是什么时候真正使用它:

Now for when to actually use it:

使用span(分别为span)而不是独立的T*(分别为const T*) 当分配的长度或大小也很重要时.因此,替换如下函数:

Use span<T> (respectively, span<const T>) instead of a free-standing T* (respectively const T*) when the allocated length or size also matter. So, replace functions like:

void read_into(int* buffer, size_t buffer_size);

与:

void read_into(span<int> buffer);

我为什么要使用它?为什么这是一件好事?

哦,跨度太棒了!使用 span...

  • 意味着您可以使用该指针+长度/开始+结束指针组合,就像使用花哨的、拉皮条的标准库容器一样,例如:

  • means that you can work with that pointer+length / start+end pointer combination like you would with a fancy, pimped-out standard library container, e.g.:

  • for (auto& x : my_span) {/* do stuff *

本文标题为:什么是“跨度"?我什么时候应该使用一个?

基础教程推荐