【问题标题】:How to construct a span from std::iota?如何从 std::iota 构建跨度?
【发布时间】:2023-01-25 04:08:02
【问题描述】:

以下作品

#include <vector>
#include <ranges>

int main() {
    auto view = std::vector<int>{0,1,2,3,4};
    auto s = std::span{view.begin(), view.end()};
    std::vector test(view.begin(), view.end());
}

但这不

#include <vector>
#include <ranges>

int main() {
    auto view = std::ranges::iota_view{0, 1000};
    auto s = std::span{view.begin(), view.end()};
    std::vector test(view.begin(), view.end());
}

问题是我有一些通用代码,我想在其中向它发送一个范围,并且创建跨越该范围。我试过发送矢量,没问题。 iota 的结果失败了。

template <typename TRange>
requires std::ranges::random_access_range<TRange>
void Foo(TRange const & r)
{
     // The algorithm starts with a full span and then partitions
     auto s = std::span(r.begin(), r.end());
}

代码是从 boost 移植过来的,在那里我会使用 boost::make_iterator_range 但我猜这在标准库中被 std::span 取代了。这是正确的吗?

【问题讨论】:

    标签: c++ c++20 std-span


    【解决方案1】:

    你不知道。

    std::span&lt;int&gt; 需要一个连续的范围。 std::vector&lt;int&gt; 是一个连续的范围,但是views::iota(0, 100) 不是连续的,它只是随机访问。


    旁注:写views::iota(0, 1000),不要写ranges::iota_view{0, 1000}。几乎没有任何理由将 ranges::meow_view 写成 views::meow,而且它很容易变得更糟 - 后者并不总是给你一些类型是前者的东西。将 meow_view 视为实现细节。

    【讨论】:

    • 赞成。但事实证明我正在寻找的是我在下面回答的子范围。
    【解决方案2】:

    我正在寻找的不是 std::span 而是 std::ranges::subrange ,它更通用并且适用于非连续内存。

    #include <vector>
    #include <ranges>
    
    int main() {
        auto view = std::views::iota(0, 1000);
        auto s = std::ranges::subrange{view.begin(),view.end()};
        std::vector test(view.begin(), view.end());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多