Генерация range :: view из необработанного указателя (разрушенного массива в стиле C) и размера - PullRequest
3 голосов
/ 04 октября 2019

Используя функцию из библиотеки C, предоставляющую указатель и размер, существует ли (или будет) способ генерирования range :: view непосредственно из него? Как я понял, представлениям нужны начальный итератор и страж, так что мне придется копировать содержимое разрушенного массива C в вектор, чтобы иметь возможность использовать представления в этом случае?

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Вам не нужно делать никаких копий. Наряду с диапазонами, 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
2 голосов
/ 10 октября 2019

Если std::span недоступен, вы можете воспользоваться тем, что указатель является итератором C ++.

Учитывая указатель p и размер n, вы можете использовать пару итераторов [p, p + 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

...