以下作品:
#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
取代了,对吗?
2条答案
按热度按时间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
看作是实现细节。z31licg02#
我要找的不是
std::span
,而是std::ranges::subrange
,后者更通用,适用于非连续内存。