从原始指针(衰减的 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
使用 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