从原始指针(衰减的 C 样式数组)和大小生成范围::视图

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

本文关键字:视图 范围 数组 指针 原始 衰减 样式      更新时间:2023-10-16

使用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,你可以使用一对迭代器 [pp + n( 来构造一个范围,使用ranges::subrange

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