【问题标题】:Is it possible to get a sub-array of a std::array in C++?是否可以在 C++ 中获取 std::array 的子数组?
【发布时间】:2016-07-02 23:16:04
【问题描述】:

我想做类似的事情

std::array<int, 5> array1 = {{ ... }};
const std::array<int, 3>& array2 = array1[1:4]; // [x:y] doesn't exist

也就是说,得到一个数组,它是另一个数组的一种视图,而不必复制它。

【问题讨论】:

  • 在 C++ 标准库中,他们通过传递成对的迭代器而不是对数组的引用来解决这个问题。随机访问迭代器可以很容易地偏移子范围。
  • 除非你没有告诉编译器第一个和最后一个元素之间的距离。在不知道你有三个元素的情况下,你无法展开循环。

标签: c++ c++11 stl


【解决方案1】:
std::array<int, 3>& array2 = reinterpret_cast<std::array<int, 3>&>(array1);

【讨论】:

  • 这不违反严格的别名吗?
  • @JamesRoot,确实如此。
  • 违反它最猛烈。我能想到几个我不会在公共论坛上使用的颜色类比。
  • 这将依赖于 std::array 包装一个 C 样式的数组(在这种情况下,我不相信存在别名冲突),但标准并不要求这样做
  • @user4581301,我使用这种技术已经有一段时间了,有趣的是,在使用std::array 时,我从未设法使clanggcc 产生strict aliasing 警告。也许std::array&lt;T,N&gt; 的内部表示为T[N] 有一些特别之处,使它起作用。我说的是这段代码,例如std::array&lt;int,3&gt; aa = {{1,2,3}}; std::array&lt;int,2&gt;&amp; ee = reinterpret_cast&lt;std::array&lt;int,2&gt;&amp;&gt;(aa[1]); assert(ee[0] == 2);
【解决方案2】:

不,你不能那样做。所有标准库容器都是其数据的唯一所有者,std::array 也不例外。事实上,std::array 被限制为以这样一种方式实现,即元素存储在类的实际数组成员中,这使得别名不可能。

有一个array_view 类的提议,它表示对连续数据块的非拥有视图。你可以阅读它here。我不知道这个提案的状态(当前的 C++ 标准化过程让我很困惑)。

【讨论】:

  • 我认为引用 (array&) 无论如何都不拥有数据。
  • @Slava:C++ 核心指南类型span&lt;T&gt;, `string_span> 怎么样?
【解决方案3】:

如果你使用 valarray 而不是 array,你可以 http://en.cppreference.com/w/cpp/numeric/valarray/slice

编辑:从 C++20 开始,您可以使用 std::span 引用连续子数组

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多