从原始指针(衰减的 C 样式数组)和大小生成 ranges::view

Generating a ranges::view from a raw pointer (decayed C style array) and a size

使用 C 库中提供指针和大小的函数,是否有(或将有)直接从中生成 ranges::view 的方法? 据我所知,视图需要一个开始迭代器和一个哨兵,所以我是否必须将衰减的 C 数组的内容复制到一个向量中才能在这种情况下使用视图?

您不需要制作任何类型的副本。除了范围之外,C++20 还将具有 std::span,它接受一个指针和一个大小并将其视为一个容器。然后您可以将其传递给所有范围函数。那看起来像

std::size_t size;
auto ptr = c_function_call(&size); // or however you get the pointer and size from the c function
std::span container{ptr, size};
// use container with any view you want here

如果 std::span 不可用,您可以利用指针 C++ 迭代器这一事实。

给定一个指针 p 和一个大小 n,您可以使用一对迭代器 [p, p + n) 构造一个使用 [=16] 的范围=]:

void print(int i) { std::cout << i << " "; }

int values[6] = {0, 1, 2, 3, 4, 5};

// Example of a pointer and a size.
const int* ptr = values;
const std::size_t n = 3;

auto r = ranges::subrange(ptr, ptr + n);
ranges::for_each(r, print);  // Prints:  0, 1, 2

工作示例:https://wandbox.org/permlink/eeIa96ieCb8GIQcM