c++ 如何从std::ι构造一个span?

wecizke3  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(149)

以下作品:

#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());
}

问题是,我有一些泛型代码,我想发送给它一个范围,然后在该范围上创建一个span。我试过发送一个vector,它很好。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取代了,对吗?

46scxncf

46scxncf1#

你不知道。
std::span<int>需要连续范围。std::vector<int>是连续范围,但views::iota(0, 100)不连续,它只是随机访问。
旁注:写views::iota(0, 1000),不要写ranges::iota_view{0, 1000}。几乎没有任何理由写ranges::meow_view而不是views::meow,而且情况很容易变得更糟-后者并不总是给你前者类型的东西。把meow_view看作是实现细节。

z31licg0

z31licg02#

我要找的不是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());
}

相关问题